Внедрение зависимости - PullRequest
       19

Внедрение зависимости

5 голосов
/ 04 марта 2011

Я очень новичок в этом, так что терпите меня.

У меня есть приложение MVC, использующее шаблон Service / Repository / EF4, и я пытаюсь использовать Ninject. У меня это работает на контроллерах, они конструктор вводится с сервисами, но сервисы конструктор вводится с репозиториями, и я не уверен, где это обрабатывать.

Я пытаюсь сделать так, чтобы каждый слой знал только о слое ниже, это правильно? Если да, то приложение MVC знает только об уровне обслуживания, а уровень обслуживания знает только об уровне хранилища и т. Д. Поэтому в моем модуле Ninject, где я создаю привязки, я не могу сказать:

Bind(Of IRepository(Of Category)).To(Of EFRepository(Of Category))

Где мне делать инъекцию?

1 Ответ

7 голосов
/ 04 марта 2011

Комментарии к вашему вопросу действительно предоставляют некоторую полезную информацию.

Обычно я организовываю такие вещи, чтобы выполнить то, о чем вы говорите - только часть этого относится непосредственно к внедрению зависимости:

  • Я настроил свое решение Visual Studio так, чтобы в приложении был один проект / сборка для каждого слоя.Имея это таким образом, вы должны установить ссылку из проекта одного слоя на другой, чтобы иметь возможность вызывать этот слой.Так, например, вы устанавливаете ссылку из уровня приложения MVC на уровень сервиса, но не из приложения MVC на уровень репозитория, чтобы не допустить прямого доступа приложения MVC к уровню репозитория.
  • Внутри каждогоВ проекте слоя я помещаю интерфейсы и классы, которые должны использоваться в верхнем пространстве имен проекта, и помещаю фактическую реализацию интерфейсов и других классов, которые должны быть скрыты, в подпространство имен, обычно называемое «Impl» или что-то в этом роде;Эти классы также объявляются как «внутренние», что гарантирует, что они могут быть использованы только из сборки (слоя), а не из другого слоя по ошибке.
  • Каждый проект / слой объявляет один модуль NInject, который связываетоткрытые интерфейсы к внутренним классам реализации.
  • В корне композиции вашего приложения (см. ссылку Марка Симана: Где я должен делать инъекцию с Ninject 2+ (и как мне расположить свои модули?) ), вы создаете ядро, которое загружает эти модули.
  • Фактическая инъекция в основном выполняется с помощью инжектора конструктора, а это означает, что сами классы ничего не знают о происходящем внедрении (иногда вам нужно использоватьАтрибут [Inject], хотя, если у вас есть неоднозначные конструкторы).
...