Ninject vs Unity для DI

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

и в коде:

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

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