企业库Unity与其他IoC容器[关闭]


135

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


9
这些类型的问题总是封闭的。意见很重要。有放置它们的地方吗?
Jeson Martajaya 2015年

1
@JesonMartajaya,我想赞扬完全一样的评论,令人烦恼的是,这些问题越来越接近,但没有其他选择的答复。
Mohammed Noureldin

Answers:


234

我正在为用户组准备演示文稿。因此,我只是经历了一堆。即:AutoFac,MEF,Ninject,Spring.Net,StructureMap,Unity和Windsor。

我想炫耀90%的情况(构造函数注入,这主要是人们无论如何都使用IOC的原因)。 您可以在此处查看解决方案(VS2008)

因此,有一些主要区别:

  • 初始化
  • 对象检索

它们每个都具有其他功能(有些具有AOP和更好的Gizmos,但通常我希望IOC要做的就是为我创建和检索对象)

注意:使用CommonServiceLocator可以消除不同库对象检索之间的差异:http : //www.codeplex.com/CommonServiceLocator

剩下的初始化工作有两种:通过代码或通过XML配置(app.config / web.config / custom.config)。有些支持两者,有些仅支持一种。我应该注意:一些使用属性来帮助IoC。

因此,这是我对差异的评估:

Ninject

仅代码初始化(带有属性)。希望您喜欢lambda。初始化代码如下所示:

 IKernel kernel = new StandardKernel(
                new InlineModule(
                    x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
                    x => x.Bind<ICustomerService>().To<CustomerService>(),
                    x => x.Bind<Form1>().ToSelf()
                    ));

结构图

初始化代码或XML或属性。v2.5也很lambda'y。总而言之,这是我的最爱之一。有关StructureMap如何使用属性的一些非常有趣的想法。

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>();
 });

统一

初始化代码和XML。不错的库,但是XML配置很麻烦。微软或高速公路商店的好图书馆。代码初始化很容易:

 container.RegisterType<ICustomerRepository, CustomerRepository>()
          .RegisterType<ICustomerService, CustomerService>();

Spring.NET

我只能说XML。但是对于功能性,Spring.Net在IoC可以做的所有事情都在阳光下进行。但是,由于唯一的统一方法是通过XML,因此.net shop通常避免使用它。虽然,由于.net版本的Spring.Net与Java Spring项目之间的相似性,许多.net / Java商店都使用Spring.Net。

注意:现在可以通过引入Spring.NET CodeConfig来配置代码。

温莎

XML和代码。像Spring.Net一样,温莎将做您想做的所有事情。温莎可能是周围最受欢迎的IoC容器之一。

IWindsorContainer container = new WindsorContainer();
container.AddComponentWithLifestyle<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");

Autofac

可以混合使用XML和代码(使用v1.2)。漂亮的简单IoC库。似乎基本功不大。通过局部范围的组件和定义明确的生命周期管理来支持嵌套容器。

这是您如何初始化它:

var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
        .As<ICustomerRepository>()
        .ContainerScoped();
builder.Register<CustomerService>()
        .As<ICustomerService>()
        .ContainerScoped();
builder.Register<Form1>();

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

注意:克里斯·布兰德斯玛(Chris Brandsma)将他的原始答案变成了博客文章


1
仅Xml配置,使配置更加困难。基本上,我看到的唯一想使用Spring.Net的人都是前Java开发人员。
克里斯·布兰德斯玛

克里斯(Chris),关于您的结论:请您进一步详细说明一下:a)您要指的是C#3的哪些功能,以及b)哪种初始化对您很重要?谢谢!
Nicholas Blumhardt

2
嗨,尼古拉斯:至于C#3支持,Autofac已经做的一切。:)对于初始化,我希望轻松支持单例/非单例以及每个会话的初始化。最后,我想通过自定义名称引用的简单方法。(这是StructureMap中的PITA)。我现在最喜欢的最后一个功能莫过于我最初写这篇文章时的功能:自动模拟。我不是一直使用它,但是有一个很好的助手。
克里斯·布兰德斯玛

您还提到了MEF,我使用MEF交付了IRepository实现对象,并发现它工作正常。您对MEF有何看法?
terjetyl

这里是一个不错的,20分钟的截屏展示最统一:pnpguidance.net/Screencast/...

7

据我所知,它们几乎相同,只是这里和那里的一些实现细节。Unity在竞争中的最大优势在于它是由Microsoft提供的,有很多公司担心OSS。

一个缺点是它是一个相当新的东西,因此可能存在一些老玩家已经解决的错误。

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



3

如果我弄错了,请纠正我,但我认为Autofac本身支持XML配置,如以下链接中所列:Autofac XML配置


2

Spring具有一项功能,可以根据参数名称或位置将参数注入构造函数或属性。如果参数或属性是简单类型(例如,整数,布尔值),这将非常有用。请参阅此处的示例。我认为这并不能真正弥补Spring无法在代码中进行配置。

温莎也可以做到这一点,并且可以使用非配置代码来实现。(如果我错了,请纠正我,我只是通过这里听到的内容进行检查)。

我想知道Unity是否可以做到这一点。



1

为了增加我的2美分,我尝试了StructureMap和Unity。我发现StructureMap的文档很少/有误导性,在配置时很麻烦,而且使用起来很笨拙。同样,它似乎不支持诸如在解析时重写构造函数参数之类的方案,这对我来说是一个关键用法。所以我放弃了它,选择了Unity,并在大约20分钟的时间内完成了我想要的工作。


1

我个人使用Unity,但这仅是因为它来自Microsoft。我为这个决定感到遗憾是有原因的:它所针对的最大问题是有一个大“ bug”,导致其不断抛出异常。您可以在调试时忽略异常。但是,如果在应用程序上运行它,则会极大地减慢您的应用程序的速度,因为抛出异常是一项昂贵的操作。例如,我目前正在代码中的某个位置“修复”此异常,在该位置Unity的异常使页面的渲染时间增加了4秒。有关更多详细信息和解决方法,请参阅:

是否可以使Unity始终不抛出SynchronizationLockException?


谢谢你的提醒!根据您提到的问题的答案,此错误现在已解决。
2013年

为什么 Unity会引发异常?通常,异常是一个“严重错误”(例如不可解决的依赖性),并且没有什么可以抑制的..
user2864740 2015年

请问,这个“错误”是否已解决,还是您找到了避免的方法?我现在在c#.net中选择框架,并渴望知道统一是否仍在花费时间...
Jog Dan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.