У меня есть класс, который имеет зависимости, которые я подключил с помощью 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 и чувствую, что я разбираюсь в основах, но не обязательно в лучших реальных способах его использования.
К счастью, это внутренний (в корпоративном смысле) lib, поэтому у меня есть пленная аудитория - другие разработчики в моей команде, используя стандартный инструмент. Теперь у каждого разработчика могут быть разные привязки, которые они хотят, следовательно, мое первоначальное quandry. Re: ctor vs prop injection, prop наверняка, похоже, много крутизны, мне приходится писать, но я беспокоюсь о том, что список зависимостей растет со временем и, таким образом, звонит ctor. Есть ли другие недостатки в том, чтобы поддерживать инъекции, на которые я должен обратить внимание? – bakasan
Даже с внутренним приложением я бы по-прежнему придерживался тех же принципов, что и более чистый код с лучшим разделением проблем. Существует много потенциальных проблем с Injection, включая защиту инвариантов (есть зависимость null?), Возможно, «горячая» замена инъецируемой зависимости (вероятно, не то, что вы хотите сделать) и более неопределенный API в целом. –
О, и просто для того, чтобы быть в прямом и явном виде: я считаю Service Locator анти-шаблоном: http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx –