企业库Unity与其他IoC容器

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.

所以这是我对差异的评估:

Ninject

仅代码初始化(带属性).我希望你喜欢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)

StructureMap

初始化代码或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)

Spring.NET

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)

Autofac

可以混合使用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将他原来的答案变成了博客文章.

  • 嗨尼古拉斯:至于C#3的支持,Autofac已经做的一切.:)对于初始化,我希望轻松支持单例/非单例和每会话初始化.最后,我希望通过自定义名称轻松引用.(在StructureMap中是PITA的东西).我最近喜欢的最后一个功能比我最初编写时更喜欢:AutoMocking.我不会一直使用它,但是有一个很好的方法. (2认同)

rod*_*dbv 7

据我所知,它们几乎相同,除了一些实现细节.Unity在竞争中的最大优势在于它是由微软提供的,有很多公司都害怕OSS.

一个缺点是它相当新,所以它可能有老玩家已经解决的错误.

话虽如此,您可能想要检查一下.