Enterprise Library Unity против других контейнеров IoC

Какие плюсы и минусы использования Enterprise Library Unity по сравнению с другими контейнерами IoC (Windsor, Spring.Net, Autofac ..)?

Такие вопросы всегда закрыты. Мнения важны. Есть где их разместить?

Jeson Martajaya 08.10.2015 19:18

@JesonMartajaya, я хотел поблагодарить точно такой же комментарий, досадно, что вопросы закрываются, но нет ответа на альтернативу.

Mohammed Noureldin 19.10.2017 03:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
136
2
54 670
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

Сказав это, вы можете захотеть Проверь это.

Ответ принят как подходящий

Готовлю презентацию для группы пользователей. Таким образом, я просто прошел через кучу из них. А именно: AutoFac, MEF, Ninject, Spring.Net, StructureMap, Unity и Windsor.

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

Таким образом, есть несколько ключевых отличий:

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

У каждого из них также есть другие функции (у некоторых есть АОП и более совершенные штуковины, но обычно все, что я хочу, чтобы IOC делал, это создавал и извлекал объекты для меня)

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

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

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

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 тоже очень лямбдай. В общем, это один из моих любимых. Несколько очень интересных идей о том, как 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.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");

Автофак

Может смешивать как 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 и максимальную гибкость при инициализации.

Примечание: Крис Брандсма превратил свой исходный ответ в Сообщение блога.

Только конфигурация XML, что значительно усложняет настройку. По сути, единственные люди, которые, как я вижу, хотят использовать Spring.Net, - это бывшие разработчики Java.

Chris Brandsma 18.02.2009 01:22

Крис, что касается ваших выводов: не могли бы вы подробнее рассказать а) о каких функциях C# 3 вы имеете в виду и б) какие виды инициализации важны для вас? Спасибо!

Nicholas Blumhardt 17.08.2009 19:46

Привет, Николас: что касается поддержки C# 3, все, что уже делает Autofac. :) Для инициализации мне нужна простая поддержка синглтонов / не синглтонов и инициализация для каждой сессии. Наконец, мне нужны простые способы ссылки по собственному имени. (то, что является PITA в StructureMap). Последняя функция, которая мне нравится больше, чем когда я писал ее изначально: AutoMocking. Я не использую его постоянно, но это очень приятно.

Chris Brandsma 18.08.2009 19:17

Вы также упомянули MEF, я использую MEF для доставки своих объектов реализации IRepository и считаю, что он отлично работает. Что ты думаешь о MEF?

terjetyl 27.11.2009 14:47

Вот хороший 20-минутный скринкаст, демонстрирующий большую часть Unity: pnpguidance.net/Screencast/…

Pat 12.08.2010 20:16

Ребята из Spring.NET работали над конфигурацией кода. Не знаю где это, но заинтересованные могут пройти по этой ссылке eeichinger.blogspot.com/2009/12/…

Piotr Owsiak 01.02.2011 20:04

Unity поддерживает конфигурацию как XML, так и кода. Это очень зрелый и гибкий контейнер.

Woland 16.07.2013 08:46

Доступна конфигурация @Chris Code для Spring. springframework.net/codeconfig

Beachwalker 18.11.2013 19:02

Прежде всего - отличный ответ, Крис. Одна вещь, которую я хотел бы упомянуть, - это проблема круговой зависимости. Насколько мне известно, Unity выдает только StackOverflowException, в то время как другие контейнеры IoC более выразительно информируют о причине проблемы (см. stackoverflow.com/questions/37571899/…). Для меня это существенный недостаток Unity.

Landeeyo 02.06.2016 10:38

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

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

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

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

Следует отметить одно: Ninject - единственный контейнер IoC, который поддерживает внедрение контекстных зависимостей (согласно их веб-сайту). Однако, поскольку у меня нет опыта работы с другими контейнерами IoC, я не могу сказать, так ли это.

Если это все "контекстная инъекция зависимостей" в Ninject, то .. эээ, ничего особенного. Поддерживается (различными способами) как минимум в Unity, AutoFac, Windsor.

user2864740 03.03.2015 22:19

Старая ветка, но так как это первое, что показал мне Google, когда я набрал unity vs spring.net ...

Spring делает CodeConfig сейчас, если вам не нравится конфигурация XML

http://www.springframework.net/codeconfig/doc-latest/reference/html/

Кроме того, Spring - это намного больше, чем просто контейнер DI. Если вы посмотрите на раздел «Модули» в документации, контейнер DI - это основа огромного набора функций, которые он выполняет.

Чтобы добавить свои 2 цента, я пробовал и StructureMap, и Unity. Я обнаружил, что StructureMap плохо / неправильно задокументирована, неудобна для настройки и неудобна в использовании. Точно так же, похоже, он не поддерживает такие сценарии, как переопределение аргументов конструктора во время разрешения, что было для меня ключевым моментом использования. Так что я бросил его и пошел с Unity, и он сделал то, что я хотел, примерно за 20 минут.

Я лично использую Unity, но только потому, что он от Microsoft. Я сожалею о своем решении по одной причине: самая большая вещь, которую он имеет против него, - это одна большая «ошибка», которая заставляет его постоянно генерировать исключения. Вы можете игнорировать исключения во время отладки. Однако это замедляет работу вашего приложения чрезвычайно, если вы столкнетесь с ним, поскольку создание исключения - дорогостоящая операция. Например, в настоящее время я «исправляю» это исключение в одном месте моего кода, где исключения Unity добавляют дополнительный 4 секунды ко времени рендеринга страницы. Дополнительные сведения и обходной путь см. В следующих разделах:

Можно ли заставить Unity не генерировать SynchronizationLockException все время?

Спасибо за предупреждение! Согласно этот ответ из вопроса, который вы упомянули, ошибка устранена.

Sam 25.03.2013 06:18
Почему - Unity выдает исключение? Обычно исключение - это «критическая ошибка» (например, неразрешимая зависимость), а не то, что нужно подавлять.
user2864740 03.03.2015 22:17

Извините, эта "ошибка" решена или вы нашли способ ее избежать? Я выбираю фреймворк в C# .net сейчас и хочу знать, является ли единство временными затратами ...

Jog Dan 02.12.2017 18:51

Другие вопросы по теме