Корпоративная библиотека Unity против других контейнеров IoC [закрыто]

135

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

Йоанн. В
источник
9
Эти типы вопросов всегда закрыты. Мнения важны. Есть ли место, где их разместить?
Джесон Мартаджая
1
@JesonMartajaya, я хотел бы похвалить точно такой же комментарий, это раздражает, что вопросы закрываются, но нет ответа для альтернативы.
Мухаммед Нурельдин

Ответы:

234

Я готовлю презентацию для группы пользователей. Таким образом, я только что прошел через них. А именно: 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.

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

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 shop используют Spring.Net из-за сходства .net-версии Spring.Net и проекта Java Spring.

Примечание : настройка в коде теперь возможна с введением Spring.NET CodeConfig .

Виндзор

XML и код. Как Spring.Net, Виндзор сделает все, что вы захотите. Виндзор, вероятно, один из самых популярных контейнеров 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
источник
1
Только для конфигурации XML, что значительно усложняет настройку. По сути, я вижу, что единственными людьми, которые хотят использовать Spring.Net, являются бывшие разработчики Java.
Крис Брандсма
Крис, в отношении ваших выводов: не могли бы вы рассказать подробнее о том, какие функции C # 3 вы имеете в виду, и б) какие виды инициализации важны для вас? Спасибо!
Николас Блумхардт
2
Привет Николас: что касается поддержки C # 3, все, что уже делает Autofac. :) Для инициализации мне нужна легкая поддержка синглетонов / не синглетонов и инициализация за сеанс. И наконец, я хочу простые способы ссылки по пользовательскому имени. (что-то, что является PITA в StructureMap). Последняя функция, которая мне нравится больше, чем когда я писал это изначально: AutoMocking. Я не пользуюсь им все время, но очень приятно, что у меня есть возбуждение.
Крис Брандсма
Вы также упомянули MEF, я использую MEF для доставки своих объектов реализации IRepository и обнаружил, что он работает просто отлично. Что вы думаете о MEF?
terjetyl
Вот хороший 20-минутный скриншот, демонстрирующий большую часть Unity: pnpguidance.net/Screencast/…
Пэт,
7

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

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

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

rodbv
источник
4

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

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

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

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

Ричард
источник
3

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


источник
2

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

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

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

Энтони
источник
2

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

ehsanullahjan
источник
Если это все «контекстная зависимость» в Ninject, тогда ничего особенного. Поддерживается (различными способами) в Unity, AutoFac, Windsor, как минимум.
user2864740
1

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

Jacobs Data Solutions
источник
1

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

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

Джош Муч
источник
Спасибо за предупреждение! Согласно этому ответу на вопрос, который вы указали , ошибка теперь устранена.
Сэм
Почему Unity выбрасывает исключение? Обычно исключением является «критическая ошибка» (например, неразрешимая зависимость), а не то, что нужно подавлять ..
user2864740
Извините, эта "ошибка" решена или вы нашли способ ее избежать? сейчас я выбираю фреймворк в c # .net и хочу знать, стоит ли
Jog Dan