Единица библиотеки предприятия по сравнению с другими [закрытыми] контейнерами МОК

134
задан Grigori Melnik 17 January 2012 в 18:26
поделиться

4 ответа

Я готовлю презентацию к группе пользователей. Как таковой я просто прошел набор их. А именно: AutoFac, MEF, Ninject, Spring. Сеть, StructureMap, Единица и Виндзор.

я хотел представить 90%-й случай (инжекция конструктора, которая является главным образом, для чего люди используют МОК так или иначе). можно проверить решение здесь (VS2008)

По сути, существует несколько основных отличий:

  • Инициализация
  • Объектное извлечение

у Каждого из них есть другие функции также (у некоторых есть AOP, и лучшие штуковины, но обычно все я хочу, чтобы МОК сделал, создают и получают объекты для меня)

Примечание: различия между различными библиотеками возражают, что извлечение может отрицаться при помощи CommonServiceLocator: http://www.codeplex.com/CommonServiceLocator

, Который оставляет нас с инициализацией, которая сделана двумя способами: с помощью кода или через конфигурацию XML (app.config/web.config/custom.config). Некоторая поддержка оба, некоторая поддержка только один. Я должен отметить: некоторые атрибуты использования для способствования МОК.

, Таким образом, вот моя оценка различий:

инициализация Кода Ninject

только (с атрибутами). Я надеюсь, что Вам нравятся лямбды. Код инициализации похож на это:

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

Единица

код Инициализации и XML. Хорошая библиотека, но конфигурация XML является болью в торце. Большая библиотека для Microsoft или магистральных магазинов. Инициализация кода легка:

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

Spring.NET

XML только почти я могу сказать. Но для Spring функциональности. Сеть делает все под солнцем, которое может сделать МОК. Но потому что единственный способ унифицировать через XML, его обычно избегают магазины .NET. Хотя, много Spring использования магазина .net/Java. Сеть из-за подобия между версией .NET Spring. Сеть и проект Spring Java.

Примечание : Конфигурация в коде теперь возможна с введением [1 111] Spring.NET CodeConfig.

Виндзор

XML и код. Как Spring. Сеть, Виндзор сделает что угодно, что Вы могли хотеть, чтобы это сделало. Виндзор является, вероятно, одним из самых популярных контейнеров МОК вокруг.

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 превратил свой исходный ответ в сообщение в блоге .

234
ответ дан 23 November 2019 в 23:55
поделиться

Насколько я видел, что они - в значительной степени то же, за исключением нескольких деталей реализации тут и там. Самое большое преимущество, которое Единица имеет по конкуренции, состоит в том, что она обеспечивается Microsoft, существует много компаний там, которые боятся OSS

, Один недостаток - то, что это является довольно новым, таким образом, она могла бы иметь ошибки, в которых уже разобрались плееры старшего возраста.

Однако Вы могли бы хотеть к проверка это .

7
ответ дан 23 November 2019 в 23:55
поделиться

Исправьте меня, если я ошибаюсь, но я думаю, что сам Autofac поддерживает конфигурацию XML, как перечислено в этой ссылке: конфигурация XML Autofac

3
ответ дан 23 November 2019 в 23:55
поделиться

Spring имеет одну функцию, которая может вводить параметры в конструктор или свойство на основе имени параметра или позиции. Это очень полезно, если параметр или свойство имеет простой тип (например, целое число, логическое значение). См. пример здесь . Я не думаю, что это действительно компенсирует неспособность Spring выполнить конфигурацию в коде.

Виндзор тоже может это сделать, и может сделать это в коде, а не в конфигурации. (поправьте меня, если я ошибаюсь, я просто использую то, что слышал здесь.)

Я хотел бы знать, может ли Unity это сделать.

2
ответ дан 23 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: