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

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

37
задан Steven 8 June 2011 в 17:08
поделиться

9 ответов

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

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

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

существует всесторонний список контейнеров МОК Hanselman

пз: Вы не хотите использовать Единицу

12
ответ дан Rinat Abdullin 27 November 2019 в 04:16
поделиться

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

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

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

Требования

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

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

Тест

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

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

Результаты

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

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

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

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

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

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

Заключение

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

61
ответ дан Community 27 November 2019 в 04:16
поделиться

Вот хорошая статья, которая сравнивает.NET контейнеры МОК. http://blog.ashmind.com/index.php/2008/08/19/comparing-net-di-ioc-frameworks-part-1/

12
ответ дан aogan 27 November 2019 в 04:16
поделиться

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

4
ответ дан user7375 27 November 2019 в 04:16
поделиться

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

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

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

2
ответ дан Philip Rieck 27 November 2019 в 04:16
поделиться

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

0
ответ дан Scott Wade 27 November 2019 в 04:16
поделиться

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

5
ответ дан 27 November 2019 в 04:16
поделиться

Я использовал Managed Extensibility Framework и обнаружил, что с ним довольно легко работать. Она была интегрирована в .NET 4.

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

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