我正在为一个用户组准备一个演示文稿。因此,我刚刚经历了一堆。即:AutoFac、MEF、Ninject、Spring.Net、StructureMap、Unity、Windsor。
我想展示 90% 的情况(构造函数注入,这主要是人们使用 IOC 的主要目的)。
You can check out the solution here (VS2008)
因此,有几个关键区别:
它们中的每一个都具有其他功能(有些具有 AOP 和更好的 gizmo,但通常我想要 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()
));
初始化代码或 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>();
XML 仅据我所知。但是对于功能,Spring.Net 在阳光下可以做 IoC 可以做的所有事情。但是因为统一化的唯一方法是通过 XML,所以 .net 商店通常会避免使用它。虽然,许多 .net/Java 商店使用 Spring.Net,因为 Spring.Net 的 .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");
可以混合使用 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 将他的原始答案变成了blog post。