使用Enterprise Library Unity与其他IoC容器(Windsor,Spring.Net,Autofac ..)的优缺点是什么?
我正在准备一个用户组的演示文稿.因此,我刚刚经历了一堆.即:AutoFac,MEF,Ninject,Spring.Net,StructureMap,Unity和Windsor.
我想展示90%的情况(构造函数注入,这主要是人们使用IOC的情况). 你可以在这里查看解决方案(VS2008)
因此,有一些关键的区别:
初始化
对象检索
它们中的每一个都有其他功能(有些具有AOP和更好的小发明,但通常我想让IOC做的就是为我创建和检索对象)
注意:使用CommonServiceLocator可以取消不同库对象检索之间的差异:http://www.codeplex.com/CommonServiceLocator
这使我们初始化,这有两种方式:通过代码或通过XML配置(app.config/web.config/custom.config).有些支持,有些只支持一种.我应该注意:有些使用属性来帮助IoC.
所以这是我对差异的评估:
仅代码初始化(带属性).我希望你喜欢lambdas.初始化代码如下所示:
IKernel kernel = new StandardKernel( new InlineModule( x => x.Bind().To (), x => x.Bind ().To (), x => x.Bind ().ToSelf() ));
初始化代码或XML或属性.v2.5也非常lambdayy.总而言之,这是我的最爱之一.关于StructureMap如何使用Attributes的一些非常有趣的想法.
ObjectFactory.Initialize(x => { x.UseDefaultStructureMapConfigFile = false; x.ForRequestedType() .TheDefaultIsConcreteType () .CacheBy(InstanceScope.Singleton); x.ForRequestedType () .TheDefaultIsConcreteType () .CacheBy(InstanceScope.Singleton); x.ForConcreteType (); });
初始化代码和XML.不错的库,但XML配置是一个痛苦的屁股.适用于Microsoft或高速公路商店的优秀图书馆.代码初始化很简单:
container.RegisterType() .RegisterType ();
XML只能尽我所能.但是对于功能而言,Spring.Net可以在IoC下完成所有功能.但是因为单一化的唯一方法是通过XML,所以.net商店通常会避免这种方式.虽然很多.net/Java商店都使用Spring.Net,因为.net版本的Spring.Net和Java Spring项目之间存在相似之处.
注意:现在可以通过引入Spring.NET CodeConfig在代码中进行配置.
XML和代码.像Spring.Net一样,Windsor会做任何你想做的事情.Windsor可能是最受欢迎的IoC容器之一.
IWindsorContainer container = new WindsorContainer(); container.AddComponentWithLifestyle("CustomerRepository", LifestyleType.Singleton); container.AddComponentWithLifestyle ("CustomerService",LifestyleType.Singleton); container.AddComponent ("Form1");
可以混合使用XML和代码(使用v1.2).不错的简单IoC库.似乎没有太大惊小怪做基础知识.支持具有本地组件范围和明确定义的生命周期管理的嵌套容器.
以下是初始化的方法:
var builder = new ContainerBuilder(); builder.Register() .As () .ContainerScoped(); builder.Register () .As () .ContainerScoped(); builder.Register ();
如果我今天必须选择:我可能会选择StructureMap.它对C#3.0语言功能提供了最好的支持,并且在初始化方面具有最大的灵活性.
注意:Chris Brandsma将他原来的答案变成了博客文章.
据我所知,它们几乎相同,除了一些实现细节.Unity在竞争中的最大优势在于它是由微软提供的,有很多公司都害怕OSS.
一个缺点是它相当新,所以它可能有老玩家已经解决的错误.
话虽如此,您可能想要检查一下.