Yoa*_*. B 134 .net c# enterprise-library inversion-of-control unity-container
使用Enterprise Library Unity与其他IoC容器(Windsor,Spring.Net,Autofac ..)的优缺点是什么?
Chr*_*sma 234
我正在准备一个用户组的演示文稿.因此,我刚刚经历了一堆.即: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<ICustomerRepository>().To<CustomerRepository>(),
x => x.Bind<ICustomerService>().To<CustomerService>(),
x => x.Bind<Form1>().ToSelf()
));
Run Code Online (Sandbox Code Playgroud)
初始化代码或XML或属性.v2.5也非常lambdayy.总而言之,这是我的最爱之一.关于StructureMap如何使用Attributes的一些非常有趣的想法.
ObjectFactory.Initialize(x =>
{
x.UseDefaultStructureMapConfigFile = false;
x.ForRequestedType<ICustomerRepository>()
.TheDefaultIsConcreteType<CustomerRepository>()
.CacheBy(InstanceScope.Singleton);
x.ForRequestedType<ICustomerService>()
.TheDefaultIsConcreteType<CustomerService>()
.CacheBy(InstanceScope.Singleton);
x.ForConcreteType<Form1>();
});
Run Code Online (Sandbox Code Playgroud)
初始化代码和XML.不错的库,但XML配置是一个痛苦的屁股.适用于Microsoft或高速公路商店的优秀图书馆.代码初始化很简单:
container.RegisterType<ICustomerRepository, CustomerRepository>()
.RegisterType<ICustomerService, CustomerService>();
Run Code Online (Sandbox Code Playgroud)
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<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");
Run Code Online (Sandbox Code Playgroud)
可以混合使用XML和代码(使用v1.2).不错的简单IoC库.似乎没有太大惊小怪做基础知识.支持具有本地组件范围和明确定义的生命周期管理的嵌套容器.
以下是初始化的方法:
var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
.As<ICustomerRepository>()
.ContainerScoped();
builder.Register<CustomerService>()
.As<ICustomerService>()
.ContainerScoped();
builder.Register<Form1>();
Run Code Online (Sandbox Code Playgroud)
如果我今天必须选择:我可能会选择StructureMap.它对C#3.0语言功能提供了最好的支持,并且在初始化方面具有最大的灵活性.
注意:Chris Brandsma将他原来的答案变成了博客文章.