2010-02-11 3 views
8

У меня есть класс, который имеет зависимости, которые я подключил с помощью Ninject.Создание ядра Ninject внутри библиотеки классов

public interface IFoo {} 

public class MyObject { 
    [Inject] 
    IFoo myfoo; 
} 

В реальной реализации я использую инъекцию свойств, но для того, чтобы быстро проиллюстрировать, я буду вводить на поле. Как я понимаю, вместо newing экземпляров MyObject, для того, чтобы получить эти зависимости должны быть надлежащим образом впрыскивается, мне нужно использовать

kernel.Get<MyObject>() 

Дело я спотыкаясь на однако в том, что MyObject будет использоваться только в контекст библиотеки классов. Цель состоит в том, чтобы конечные приложения создавали свои собственные модули и передавали их в экземпляр ядра для гидратации. Учитывая, что, как правило, самый прагматичный способ приблизиться к всплытию общего экземпляра ядра Ninject в мою библиотеку классов, чтобы экземпляры MyObject (и других подобных случаев) могли быть гидратированы?

Мое первое наклонение - это своего рода завод, который интегрирует одноэлементное ядро, которое сами приложения должны увлажнять/инициализировать, загружая модуль.

Так RandomService.cs

var myKernel = NinjaFactory.Unleash(); 
var myobj = myKernel.Get<MyObject>(); 
myobj.foo(); 

Прежде чем идти слишком далеко по этому пути, хотя, мне нужно сделать проверку вменяемости, чтобы убедиться, что мышление звук или что не существует какой-то другой очевидный вещь, которую мне не хватает. Я, очевидно, новичок в IoC и чувствую, что я разбираюсь в основах, но не обязательно в лучших реальных способах его использования.

ответ

9

Я не уверен, что я понимаю все детали вашего вопроса, но насколько я понимаю, вы спрашиваете, как вы можете вытеснить зависимость от Ninject.

Можно написать DI-friendly libraries without ever referencing any particular DI Container (Ninject или что-то еще). Это оставляет потребителю библиотеки возможность выбирать контейнер DI по своему вкусу (или вообще не использовать контейнер). Этот подход очень предпочтителен, поскольку он обеспечивает большую степень свободы.

Однако, вы должны действительно благоприятствуют Constructor Injection над Injection собственности. Хотя Property Injection кажется обманчиво простым в реализации, на самом деле довольно сложно получить право.

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

+0

К счастью, это внутренний (в корпоративном смысле) lib, поэтому у меня есть пленная аудитория - другие разработчики в моей команде, используя стандартный инструмент. Теперь у каждого разработчика могут быть разные привязки, которые они хотят, следовательно, мое первоначальное quandry. Re: ctor vs prop injection, prop наверняка, похоже, много крутизны, мне приходится писать, но я беспокоюсь о том, что список зависимостей растет со временем и, таким образом, звонит ctor. Есть ли другие недостатки в том, чтобы поддерживать инъекции, на которые я должен обратить внимание? – bakasan

+2

Даже с внутренним приложением я бы по-прежнему придерживался тех же принципов, что и более чистый код с лучшим разделением проблем. Существует много потенциальных проблем с Injection, включая защиту инвариантов (есть зависимость null?), Возможно, «горячая» замена инъецируемой зависимости (вероятно, не то, что вы хотите сделать) и более неопределенный API в целом. –

+2

О, и просто для того, чтобы быть в прямом и явном виде: я считаю Service Locator анти-шаблоном: http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx –

4

Точка Марка - это, безусловно, мой начальный вид (отсюда +1). NB не забудьте следовать его ссылке.

Я за один год был виноват в том, что я слишком рано отказался от конструктора над свойствами (или полями) (мое «оправдание» состояло в том, что в качестве базового класса нужны были 5 свойств, я не хотел обременять все производные классы тем, что Решение этого заключалось в том, чтобы обернуть 5 свойств, участвующих в классе или иерархии классов, представляющих любые базовые понятия, которые представляют свойства. Немного похоже на рефакторинг объектов.

Хорошее обсуждение соображений, которые я нашел полезным является http://thinkbeforecoding.com/post/2009/05/15/IOC-container-go-hide (не могу Расположить SO пост, который упоминает его и некоторые темы, вокруг него, может быть, кто-то Вводите ссылку: D)

Другой блог, который суммирует некоторые из эти точки является Your IoC Container is Showing

И http://davybrion.com/blog/2009/11/integrating-your-ioc-container-with-agatha/

0

Вот рецепт хороший общего назначения для нахождения всех Ninject модулей в текущей сборке:

IKernel _serviceKernel = new StandardKernel(); 

Assembly myAssembly = this.GetType().Assembly; 

IEnumerable<Type> ninjectModuleTypes = 
    myAssembly.GetTypes().Where(type => type.BaseType == typeof(NinjectModule)); 

foreach (Type ninjectModuleType in ninjectModuleTypes) 
{ 
    NinjectModule mod = (NinjectModule)Activator.CreateInstance(ninjectModuleType); 
    _serviceKernel.Load(mod); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^