c# - 企业库 Unity 与其他 IoC 容器

标签 c# .net inversion-of-control unity-container enterprise-library

<分区>

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

最佳答案

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

我想展示 90% 的情况(构造函数注入(inject),这主要是人们使用 IOC 的目的)。 You can check out the solution here (VS2008)

因此,存在一些关键差异:

  • 初始化
  • 对象检索

它们每个都有其他特性(有些有 AOP 和更好的小发明,但通常我希望 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()
                    ));

StructureMap

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

Unity

初始化代码和 XML。不错的库,但是 XML 配置是个麻烦事。适用于 Microsoft 或高速公路商店的很棒的图书馆。 代码初始化很简单:

 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 在代码中进行配置.

Windsor

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");

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 把他原来的答案变成了 blog post .

关于c# - 企业库 Unity 与其他 IoC 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/411660/

相关文章:

c# - LINQ 从每个查询中获取第一行

javascript - 无法在 Blazor 服务器端应用程序中使用 OnAfterRenderAsync 中的 JsRuntime.InvokeAsync

c# - 在 C# 中检查管理员权限

architecture - 洋葱与 N 层架构

c# - 如何理解规则: "Store in IoC container only services. Do not store any entities."

c# - EntityFramework 和 IoC 接口(interface)在洋葱架构中属于什么位置?

c# - 如何使用 SAS 解决 Azure 事件中心中的授权错误 (401)?

c# - 此 WPF 代码能否受益于 Parallel.For 以及如何受益?

.net - 如何将 JSON 响应中的 ASP.NET WebMethod 的 'd' 标识符更改为不同的名称?

c# - 用户 'myUser' @'DESKTOP-1FSAS' 的访问被拒绝(使用密码 : NO)