使用企业库Unity相对于其他IoC容器(Windsor,Spring.Net,Autofac等)的利弊是什么?
使用企业库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。
所以这里是我对差异的评估:
仅支持代码初始化(带属性)。我希望您喜欢lambda表达式。初始化代码如下:
IKernel kernel = new StandardKernel(
new InlineModule(
x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
x => x.Bind<ICustomerService>().To<CustomerService>(),
x => x.Bind<Form1>().ToSelf()
));
StructureMap可以使用初始化代码、XML或属性进行配置。v2.5版本也非常适合使用Lambda表达式。总的来说,这是我最喜欢的之一。关于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配置有点麻烦。适用于微软或高速公路店的优秀库。 代码初始化很容易:
container.RegisterType<ICustomerRepository, CustomerRepository>()
.RegisterType<ICustomerService, CustomerService>();
据我所知,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");
使用 v1.2 版本可以同时使用 XML 和代码。这是一个不错的、简单的 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将他原来的回答转化成了一篇博客文章。
虽然这是一个旧帖子,但当我输入“unity vs spring.net”时,这是谷歌显示给我的第一件事......
现在 Spring 已经可以使用 CodeConfig 了,如果您不喜欢 XML 配置的话。
http://www.springframework.net/codeconfig/doc-latest/reference/html/
此外,Spring 不仅仅是一个 DI 容器,在文档中的“模块”部分,DI 容器是它所做的众多工作的基础。
需要注意的一点是:据Ninject网站介绍,它是唯一支持上下文依赖注入的IoC容器。但是,由于我没有其他IoC容器的经验,无法确定是否属实。