gpt4 book ai didi

inversion-of-control - 使用 Autofac 有什么优点和缺点

转载 作者:行者123 更新时间:2023-12-04 00:16:48 26 4
gpt4 key购买 nike

我读过 Autofac 说它很快。我已经看到了所涉及的编码,它非常整洁。但我不太确定如何使用它。我用过 StructureMap,它有一个静态的 ObjectFactory。 Ninject 有内核,但在 Autofac 的 Google 页面中,他们建议这样做:

using( var resolver = builder.Build() ){
var whatINeed = resolver.Resolve<INeedThisService>();
}

这是一个 WinForms 应用程序,所以我通过上述操作得到了一个无效对象状态,所以我切换到了一个全局 IContainer,并这样做了
 using( var resolver = Program.Container.CreateInnerContainer() )
{
var whatINeed = resolver.Resolve<INeedThisService>();
}

我已经使用了大约 3 到 5 次。但这有效率吗?或者我应该做类似的事情
 var whatINeed = Program.Resolve<INeedThisService>()

在封面下
 internal static TServervice Resolver<TService>(){
if(_container == null ) _container = builder.Build();
return _container.Resolve<TService>();
}

你会使用哪个,为什么?使用 CreateInnerContainer() 也有惩罚吗?

最佳答案

我不是 AutoFac 专家,但确实有使用其他 Ioc 容器的经验。我认为这个问题会给我一个尝试 AutoFac 的理由。

基于 Ioc 容器的设计应努力隔离所有代码,使其无法访问容器,但在入口点或主机级别除外。我使用 AutoFac 和 WinForms 创建了以下示例,以展示表单如何通过其构造函数访问服务。

我不太确定你为什么认为你需要内容器。也许您可以发表评论,我可以提供更详细的回复。

static class Program
{
[STAThread]
static void Main()
{
var builder = new ContainerBuilder();
builder.Register<TheService>().As<INeedThisService>();
builder.Register(f => new Form1(f.Resolve<INeedThisService>())).As<Form1>();

using (var container = builder.Build())
{
Application.Run(container.Resolve<Form1>());
}

}
}

public interface INeedThisService { }

public class TheService : INeedThisService
{
public TheService() { Console.WriteLine("ctor ThisService"); }
}

public partial class Form1 : Form
{
public Form1(INeedThisService service)
{
Console.WriteLine("ctor Form1");
InitializeComponent();
}
}

关于inversion-of-control - 使用 Autofac 有什么优点和缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/746354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com