Подтвердить что ты не робот

Какой инструмент инъекции зависимостей следует использовать?

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

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

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

4b9b3361

Ответ 1

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

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

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

Существует полный список контейнеров IoC от Hanselman

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

Ответ 2

Недавно появилось использование 6 из них (Windsor, Unity, Spring.Net, Autofac, Ninject, StructureMap). Я могу предложить краткое резюме каждого, наших критериев отбора и нашего окончательного выбора.

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

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

Требования

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

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

Test

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

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

Результаты

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

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

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

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

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

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

Заключение

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

Ответ 4

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

Ответ 5

Я поклонник Autofac, но и Windsor и Unity сделают хорошую работу (хотя Windsor более способна, чем единство, и не требует приписывания вашего кода). Существует много хороших нетехнических причин для прикрепления к одному контейнеру в системе.

Ответ 6

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

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

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

Ответ 9

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

Ответ 10

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

Заключение из статьи:

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

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