当前位置:  开发笔记 > 编程语言 > 正文

企业库Unity与其他IoC容器

如何解决《企业库Unity与其他IoC容器》经验,为你挑选了2个好方法。

使用Enterprise Library Unity与其他IoC容器(Windsor,Spring.Net,Autofac ..)的优缺点是什么?



1> Chris Brands..:

我正在准备一个用户组的演示文稿.因此,我刚刚经历了一堆.即: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().To(),
                    x => x.Bind().To(),
                    x => x.Bind().ToSelf()
                    ));

StructureMap

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

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("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle("CustomerService",LifestyleType.Singleton);
container.AddComponent("Form1");

Autofac

可以混合使用XML和代码(使用v1.2).不错的简单IoC库.似乎没有太大惊小怪做基础知识.支持具有本地组件范围和明确定义的生命周期管理的嵌套容器.

以下是初始化的方法:

var builder = new ContainerBuilder();
builder.Register()
        .As()
        .ContainerScoped();
builder.Register()
        .As()
        .ContainerScoped();
builder.Register();

如果我今天必须选择:我可能会选择StructureMap.它对C#3.0语言功能提供了最好的支持,并且在初始化方面具有最大的灵活性.

注意:Chris Brandsma将他原来的答案变成了博客文章.


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

2> rodbv..:

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

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

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

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有