Какой инструмент внедрения зависимостей мне следует использовать?[закрыто]

StackOverflow https://stackoverflow.com/questions/148908

Вопрос

Я подумываю об использовании Microsoft Unity для моего инструмента внедрения зависимостей в наш пользовательский интерфейс.

Наш средний уровень уже использует Castle Windsor, но я думаю, что мне следует придерживаться Microsoft.

У кого-нибудь есть какие-нибудь мысли о том, какой инструмент для внедрения зависимостей является лучшим?

Это было полезно?

Решение

Привязка к одному контейнеру на самом деле не важна, если ваша система была разработана с учетом требований IoC / DI.При правильном подходе вы можете легко изменить библиотеку IoC в будущем.

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

Я бы рекомендовал выбирать между Castle (широко используется и имеет множество библиотек интеграции) и Autofac (легкий, быстрый и имеет правильную вложенность в контейнеры, но не настолько широко используется)

Существует полный список контейнеров IoC автор : Хансельман

PS:Вы не хотите использовать Unity

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

Недавно резко возросло использование 6 из них (Виндзор, Единство, Spring.Net, Автофас, Девятый объект, Структурная карта) Я могу предложить краткое изложение каждого из них, наших критериев отбора и нашего окончательного выбора.

Примечание:мы не рассматривали PicoContainer.Net, поскольку один из членов нашей команды посчитал, что порт .Net довольно плох по сравнению с версией Java.Мы также не рассматривали ObjectBuilder, поскольку Unity построен поверх ObjectBuilder2 и по умолчанию считался лучшим выбором.

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

Требования

  • Инъекция на основе конструктора (мы намерены нет чтобы использовать ввод свойства, поля или метода)
  • Программируемая конфигурация (нет XML)
  • иерархии контейнеров (по одной на приложение, на запрос и на сеанс для более неявной привязки области времени жизни компонента к контейнеру)
  • управление временем жизни компонента (для более детального определения области действия, например, переходный процесс / одноэлементный)
  • внедрение из интерфейса в тип или конкретный экземпляр (например ILogger -> typeof(FileLogger) или ILogger -> new FileLogger() )
  • расширенное создание компонентов / "механизм создания событий" для предварительной / последующей инициализации
  • правильная утилизация IDisposable демонтаж компонентов на контейнере
  • хорошо документированная и / или легко доступная онлайн-информация

    Примечание:хотя производительность была обязательным требованием, она не учитывалась при выборе, поскольку казалось, что все рассмотренные контейнеры были похожи в соответствии с этим эталонный показатель

Тест

Каждый контейнер использовался в типичном проекте Asp.Net webforms (поскольку это был наш целевой тип приложения).Мы использовали одну простую страницу с одним простым пользовательским элементом управления, каждый из которых наследуется от базовой страницы / базового элемента управления соответственно.Мы использовали 1 контейнер на BasePage для контейнера области "по запросу" и 1 в global.asax для области "приложения" и попытался объединить их вместе, чтобы зависимости могли быть разрешены из обоих контейнеров.

Каждое веб-приложение совместно использует надуманный набор объектов домена, имитирующих многоуровневую зависимость, тип области видимости (одноэлементный / переходный), а также управляемые и неуправляемые классы (IDisposable обязательно).Компоненты зависимостей "верхнего уровня" были введены вручную из методов на BasePage.

Результаты

Windsor - Удовлетворяет всем критериям и имеет хорошую историю обращений, сообщество блогеров и онлайн-документацию.Простой в использовании и, вероятно, правильный выбор.Расширенное создание компонентов на заводских мощностях.Также допускается объединение в цепочку индивидуально созданных контейнеров.

Spring.Net - Подробная и бесполезная документация и неочевидная / простая для программируемой настройки.Не поддерживал дженерики.Не выбран

Ninject - Прост в использовании с хорошей понятной документацией.Мощный набор функций, удовлетворяющий всем нашим требованиям, за исключением иерархии контейнеров, поэтому, к сожалению, не был выбран.

StructureMap - Плохо документирован, хотя имел довольно продвинутый набор функций, который отвечал всем нашим требованиям, однако не было встроенного механизма для иерархий контейнеров, хотя его можно было взломать с помощью циклов for см. здесь Интерфейс fluent с лямбда-выражением на первый взгляд показался немного чрезмерно сложным, хотя его можно было бы инкапсулировать.

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

Autofac - Хорошо документирован и относительно прост в использовании, хотя конфигурация лямбда-выражения кажется немного чрезмерно сложной, однако, опять же, может быть легко инкапсулирована.Определение области видимости компонентов достигается с помощью механизма "пометки", и все компоненты настраиваются заранее с помощью конструктора, что было немного неудобно.Дочерние контейнеры были созданы из родительского и назначены компонентам из "тега".Разрешена общая инъекция.

Заключение

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

Вот хорошая статья, в которой сравниваются .ЧИСТЫЕ контейнеры IoC.http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/

Я начал использовать Автофас год назад и с тех пор ни разу не оглядывался назад..

Я фанат Autofac, но и Windsor, и Unity отлично справятся с работой (хотя Windsor более эффективен, чем unity, и не требует атрибуции вашего кода).Однако существует множество веских нетехнических причин для того, чтобы придерживаться одного контейнера в системе.

Используйте то, что работает.Большинство из них обладают уникальными для них функциями, и почти все они более многофункциональны, чем Unity.Если unity - это все, что вам нужно, вы, безусловно, можете им воспользоваться.

Использование Microsoft Unity только потому, что оно от Microsoft, - плохой способ принятия решения.Подумайте о том, что вам нужно и почему, и выберите то, что соответствует вашим потребностям.

Тем не менее, я поддерживаю идею придерживаться одного контейнера, если это возможно.

Я пользовался Платформа управляемой Расширяемости и обнаружил, что с ним довольно легко работать.Это было интегрирован в .NET 4.

Если у вас уже нет опыта и личных предпочтений в отношении конкретной субтехнологии, используемой в одном из возможных контейнерных решений IoC, все они работают хорошо, и я не вижу ни одного конкретного устройства с "убойной функцией", которая выделяла бы его среди других.Unity, вероятно, лучше всего подходит для решений, уже использующих корпоративную библиотеку P & P 4.x...

Бенчмарк контейнеров IoC - Сравнение производительности содержит сравнительные таблицы производительности и функций для более чем 20 продуктов и поддерживает их в актуальном состоянии.

Вывод из статьи:

SimpleInjector, Hiro, Funq, Munq и Dynamo предлагают лучшую производительность они чрезвычайно быстры.Дайте им попробовать!

Особенно Простой Инжектор кажется, это хороший выбор.Это очень быстро, имеет хорошую документацию, а также поддерживает расширенные сценарии, такие как перехват и универсальные декораторы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top