Мы используем ASP.net MVC.
Какой из них лучший фреймворк DI Ninject или Unity и почему?
Мы используем ASP.net MVC.
Какой из них лучший фреймворк DI Ninject или Unity и почему?
Ответы:
В прошлый раз, когда я посмотрел на них, я обнаружил, что Ninject немного лучше. Но у обоих есть свои недостатки.
У Ninject есть лучшая схема быстрой настройки. Похоже, что Unity в основном полагается на конфигурацию XML. Главный недостаток Ninject в том, что он требует, чтобы вы ссылались на Ninject.Core повсюду в вашем коде, чтобы добавить атрибуты [Inject].
Если я могу спросить, почему вы ограничиваете свой выбор этими двумя? Я думаю, что Castle.Windsor, Autofac и StructureMap не хуже или лучше.
Я знаю, что это старый вопрос, но вот мои мысли:
Мне лично нравится Ninject. Мне нравится свободный интерфейс и отказ от XML. Мне вообще нравится XML, но не для такого рода конфигов. Свободные интерфейсы облегчают исправление, особенно при рефакторинге.
Мне не хватает ObjectFactory StructureMap, но есть простые обходные пути, чтобы добавить это в Ninject.
Как указывает Джеффри, вам не нужно использовать атрибут [Inject], когда у вас есть только один конструктор.
Я обнаружил, что предпочитаю плавные интерфейсы не только потому, что они избегают XML, но и потому, что они вызывают ошибки времени компиляции, когда я меняю что-то, что на них влияет. Конфигурация XML не работает, и чем меньше я должен помнить, чтобы изменить, тем лучше я.
Я согласен с Мендельтом, не существует "лучшей" структуры 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)
Лично я думаю, что это проясняет, что происходит, но, конечно, можно возразить, что у вас будут ссылки на единство во всем вашем приложении. Тебе решать.
http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison
Unity быстрее, но не лучший