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


104

Ми використовуємо ASP.net MVC.

Який із них є найкращим рамком DI Ninject або Unity і чому?


94
NInject краще, тому що ви можете придбати круті фірмові магніти з їх веб-сайту.
Іван Григорович

5
Оновлена ​​версія цього питання (дуже схожа в будь-якому випадку), яка може виявитися корисною для деяких: stackoverflow.com/questions/4581791/…
Jason Down

Відповіді:


46

Востаннє, коли я дивився на будь-який з них, я виявив Нінжект трохи кращим. Але в обох є свої недоліки.

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, тому що моєму клієнту подобається те, що він говорить про бібліотеку Microsoft Enterprise (Unity) на DLL, якщо ви отримаєте те, що я говорю.

Я використовую як конфігурацію 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.