Ми використовуємо ASP.net MVC.
Який із них є найкращим рамком DI Ninject або Unity і чому?
Ми використовуємо ASP.net MVC.
Який із них є найкращим рамком DI Ninject або Unity і чому?
Відповіді:
Востаннє, коли я дивився на будь-який з них, я виявив Нінжект трохи кращим. Але в обох є свої недоліки.
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, тому що моєму клієнту подобається те, що він говорить про бібліотеку Microsoft Enterprise (Unity) на DLL, якщо ви отримаєте те, що я говорю.
Я використовую як конфігурацію 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-compitation
Єдність швидше, але це не найкраще