Ninject / IoC правильная инициализация StandardKernel - PullRequest
0 голосов
/ 03 марта 2012

Я только начинаю работать с контейнерами IoC и подобрал Ninject для начала.Я понимаю принцип отдельных модулей, которые вы можете включить в ядро.Но мне любопытно, должна ли быть везде первая строка в моем коде, где я собираюсь попросить конкретную реализацию чего-либо из моего уровня обслуживания.10 методов, которые используют ContentService. Должен ли я действительно обновлять модуль и ядро ​​в каждом методе?Похоже на запах кода.Как большинство разработчиков справляются с этим с помощью Ninject?Есть ли в Интернете какие-либо статьи, показывающие, как это сделать с классом потребителей?

Ответы [ 2 ]

3 голосов
/ 03 марта 2012

Если у меня есть класс с 10 методами, которые используют ContentService, я должен действительно новый модуль и ядро ​​в каждом методе?

Нет, у вас должен быть этот класс, принимающий IContentService в качестве параметра конструктора (поскольку он зависит от него внутри своих методов), а затем попросите ядро ​​предоставить вам экземпляр этого класса. Ваши классы не должны ничего знать о контейнере DI (в вашем случае Ninject). Они никогда не должны ссылаться на это.

1 голос
/ 04 марта 2012

Существует два основных способа работы с IoC: внедрение зависимостей (DI) и расположение службы (SL).Имея дело с внедрением зависимостей, вы предоставляете свои зависимости извне ваших классов.Как правило, вы делаете это путем внедрения (передачи) ваших зависимостей в конструктор класса или с помощью установщиков.Например:

public class SomeClass {
        public ISomeDependency SomeDependency {get;set;} 

        public SomeClass(ISomeOtherDependecy someOtherDependency) {
           //...
        }
}

В этом случае вы МОЖЕТЕ предоставить реализацию ISomeDependency через свойство и СЛЕДУЕТ предоставить реализацию ISomeOtherDependecy через конструктор.Поддержка Ninject в обоих направлениях.

Другой способ выполнения (SL) позволяет запрашивать ваши зависимости в нужный момент, например:

public void DoSomeAction() {
   ISomeDependency someDependency = MyServiceLocatorImpl.GetInstance<ISomeDependence>()
}

Если вы планируете использоватьПодход SL (или гибридный), вы можете использовать Common Service Locator (для Ninject есть поддержка ).Это облегчает переключение нашего механизма IoC позже.

...