Autofac - 多模块应用程序中的正确使用方法

8
我正在开发一个应用程序,它由许多模块组成,其中一些模块依赖于其他模块。现在我决定使用Autofac来解决循环依赖并改进整体架构。
为了配置autofac,我使用xml方法(http://code.google.com/p/autofac/wiki/XmlConfiguration)。
现在我不确定如何实现Autofac。我需要在我的应用程序的每个模块中都引用autofac吗?这意味着每次我想解决依赖关系时都必须注册所有组件...
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterModule(new ConfigurationSettingsReader("autofac", configPath));
IContainer container = builder.Build();
IWhatever w = container.Resolve<IWhatever>();

这样做是正确的吗?

还是更好地将Autofac包装在单独的模块中? 采用这种方法,我只需要在应用程序启动时注册模块一次,并且可以直接使用封装的Autofac来解析依赖关系...

IWhatever w = container.Resolve<IWhatever>();

我希望有人能告诉我如何最好地使用Autofac。
谢谢!

2
使用Autofac(或任何其他DI容器)的最佳方法是尽可能少地引用它。这个答案可能会有所帮助。 - default.kramer
谢谢,这也是我在想的。我只是不确定使用Autofac的最佳实践是什么... - Fabian
2个回答

8

-2

为容器创建单独的模块不仅是更好的选择,而且是唯一正确的选择。据我所知,IoC容器实例必须是单例。

至少我是这样使用Unity的 - 在应用程序启动时创建公开可用的静态容器实例,然后从所有模块中访问它。


4
不行,不行,还是不行。拥有单实例(任何东西)很少是一个好主意。在大多数情况下,都有更好的解决方案。这里也是一样。 - jgauffin
那么,这是什么?你没有提供一个吗?你不能在每个模块中使用问题中提供的代码,因为这会创建很多开销。我不确定,但调用builder.Build可能会实例化容器中的所有对象 - 这是非常糟糕的想法。 - vlad2135
2
很多开销?容器只会在应用程序的生命周期内构建一次。 - jgauffin
哦,现在我不确定该怎么想 ^^' 在这种情况下,我只是不确定最佳做法是什么。在每个模块中引用 Autofac 确实会产生一些额外开销。为了获取容器,我需要每次注册所有组件,就像我在帖子中提到的那样... - Fabian
3
Singleton模式是一种设计模式,通过遵循一定的模式可以在任何时间和任何地方访问它。而创建容器仅需一次,则可以在一个调用期间(有限时间)内获得对容器模块(有限范围)的所有访问权限。这就是它们之间的区别。 - jgauffin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接