我在之前的项目中一直使用Castle Windsor,我非常喜欢它。对于我目前的项目,我希望使用不同的IoC容器。 Castle Windsor自2007年以来没有任何新版本,但仍未达到版本1.0,因此很难证明在商业环境中使用它是正确的。
我喜欢Castle Windsor的一个方面是,只需通过制作服务器IInitializable
,您就可以在设置了所有依赖项后,在容器上调用Initialize方法。我经常使用它。它可以很容易地进行属性注入而不是构造函数注入,并且可以清理代码和测试。
我一直在寻找StructureMap,AutoFac,Unity和Spring.Net作为替代方案,但只有Spring.Net支持类似的东西,它会自动调用Init()
方法。不幸的是,Spring.Net并不真正支持我想要使用IoC容器的方式(它注入基于字符串键而不是接口声明,因此它的自动装配支持也是有限的)
我是否错过了我看过的IoC容器中的类似功能?我以某种方式处理IoC容器的方式是错误的吗?或者是否有其他IoC容器支持IInitializable或Init()?
答案 0 :(得分:4)
Autofac可以做到 - 他们称之为Startable
答案 1 :(得分:2)
使用StructureMap,您可以执行以下操作:
ForRequestedType<IFoo>()
.TheDefaultIsConcreteType<Foo>()
.OnCreation(x => x.Init());
这并不像在课堂上实现“初始化”界面那么容易,但这也意味着你不需要通过继承DI容器特定的界面将你的类实现绑定到你选择的DI容器上(虽然我'我不确定现实中存在多少问题。
我认为构造函数注入现在更常用,并且属性注入被广泛视为无法让DI容器为您执行对象构造(例如ASP.NET webforms)的情况下的后备。我可能在那里错了,这只是我对这个主题的看法!
你真的认为注入属性“可以清理代码并进行相当多的测试”吗?这很有趣,因为我认为相反 - 我认为构造函数注入'更干净',我猜这可能只是因为我通常这样做,所以这就是我习惯的。 :)
答案 2 :(得分:2)
Castle可能在一段时间内没有任何释放,但它仍然在积极开发。您可以获得最新(非常稳定)的构建here。
很快就会有正式的v2.0发布。如果你知道它很好,为什么不使用你已经知道的东西呢?
答案 3 :(得分:2)
LinFu.IOC拥有它 - 它被称为IInitialize。你可以在这里找到它:github.com/philiplaureano/LinFu