Ninject vs Unity для DI [закрыто]


104

Мы используем ASP.net MVC.

Какой из них лучший фреймворк DI Ninject или Unity и почему?


94
NInject лучше, потому что вы можете купить классные фирменные магниты на их сайте.
Иван Г.

5
Обновленная версия этого вопроса (в любом случае очень похожая), которую некоторые люди могут найти полезной: stackoverflow.com/questions/4581791/…
Джейсон Даун

Ответы:


46

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

У Ninject есть лучшая схема быстрой настройки. Похоже, что Unity в основном полагается на конфигурацию XML. Главный недостаток Ninject в том, что он требует, чтобы вы ссылались на Ninject.Core повсюду в вашем коде, чтобы добавить атрибуты [Inject].

Если я могу спросить, почему вы ограничиваете свой выбор этими двумя? Я думаю, что Castle.Windsor, Autofac и StructureMap не хуже или лучше.


47
Вам нужно использовать атрибут Inject только в том случае, если существует более одного конструктора, и вам нужно указать Ninject, какой конструктор использовать. По умолчанию он использует конструктор с наибольшим количеством параметров.
Джеффри Кэмерон

11
А пока есть официальное расширение Ninject.Web.Mvc. Вы изменяете свое MvcApplication на производное от NinjectHttpApplication, запускаете в нем ядро ​​и вызываете RegisterAllControllersIn (Assembly.GetExecutingAssembly ()), чтобы он позаботился обо всех контроллерах в данной сборке. Магия.
Майкл Штум

18
Этот ответ теперь не имеет отношения к Ninject 2. В то время как жалоба на Ninject 1 была законной, Ninject 2 позволяет работать, не засоряя классы атрибутами. ninject2 будет работать прозрачно, без необходимости изменять ваши классы.
chillitom

3
То же самое для единства , как это , кажется, полностью настраивается с помощью кода в этой точке (v3.0.1304.1)
Эрик

46

Я знаю, что это старый вопрос, но вот мои мысли:

Мне лично нравится Ninject. Мне нравится свободный интерфейс и отказ от XML. Мне вообще нравится XML, но не для такого рода конфигов. Свободные интерфейсы облегчают исправление, особенно при рефакторинге.

Мне не хватает ObjectFactory StructureMap, но есть простые обходные пути, чтобы добавить это в Ninject.

Как указывает Джеффри, вам не нужно использовать атрибут [Inject], когда у вас есть только один конструктор.

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


10

Ninject обнаруживает циклические зависимости, если вы используете конструкторы инъекций, в отличие от Unity, которые независимо от техники инъекции просто генерируют исключение StackOverflowException, которое чрезвычайно сложно отлаживать.


9

Я согласен с Мендельтом, не существует "лучшей" структуры DI. Это просто зависит от ситуации, и у всех есть плюсы и минусы. Думаю, Дэвид Хайден сказал на DotNet Rocks, что Unity является предпочтительным выбором, если вы используете остальную часть EntLib и знакомы с этим. Я лично использую Unity, потому что моему заказчику нравится, что в библиотеках DLL написано Microsoft Enterprise Library (Unity), если вы понимаете, о чем я говорю.

Я использую как xml-конфигурацию для настройки интерфейсов, так и их конкретные реализации, но затем я использую атрибуты в коде при инъекции, например:

<type type="ILogger" mapTo="EntLibLogger">
   <lifetime type="singleton"/>
</type>

и в коде:

[InjectionConstructor]
public Repository([Dependency] ILogger logger)

Лично я думаю, что это проясняет, что происходит, но, конечно, можно возразить, что у вас будут ссылки на единство во всем вашем приложении. Тебе решать.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.