Первые шаги с IoC, потому что я врезался в стену, пожалуйста, объясните «за кадром» - PullRequest
2 голосов
/ 21 декабря 2009

Итак, я начал этот новый проект и пытался включить все новые принципы проектирования, о которых читал, а именно, пытаться сделать вещи слабо связанными, тестируемыми и следовать некоторым шаблонам.

Итак, я столкнулся с необходимостью передавать слишком много фабрик / менеджеров в конструктор моих классов, что привело меня к внедрению Dependancy.

public class SomeClass
{
   public SomeClass(IDBFactory factory, IOrderManager orderManager, ....)
}

Поэтому, если я использую ninject, из того, что я понимаю, я бы связал конкретную реализацию с классом.

Так что же происходит за кулисами?

NInject будет всякий раз, когда я создаю экземпляр SomeClass, он будет связывать реализацию, которую я определил в файле конфигурации?

1012 * т.е. *

Я делаю:

ISomeClass sc = NInject.Get<ISomeClass>();

и ninject сделает:

new SomeClassImpl(pass in all the implementaitons in the constructor)

правильный

1 Ответ

4 голосов
/ 21 декабря 2009

Я не знаю NInject, но большинство DI-контейнеров поддерживают Auto-Wiring , который работает следующим образом:

  1. Когда вы запрашиваете ISomeClass, он просматривает список всех зарегистрированных типов. Используя этот список, он обнаруживает, что желаемой реализацией ISomClass является SomeClass.
  2. Он будет использовать конструктор SomeClass для создания экземпляра (возможно, с использованием Activator.CreateInstance), поэтому он использует Reflection, чтобы выяснить, какие параметры требуются.
  3. Для каждого параметра он смотрит на тип и повторяет шаг 1-2 для каждого.

Таким образом, процесс может быть рекурсивным, но в итоге вы должны получить полностью заполненный граф объектов, где все зависимости удовлетворены.

...