Простейшее объяснение того, как работает DI-контейнер? - PullRequest
12 голосов
/ 22 июня 2010

В простых терминах и / или в псевдокоде высокого уровня, как работает контейнер DI и как он используется?

Ответы [ 3 ]

5 голосов
/ 23 июня 2010

В своей основе DI-контейнер создает объекты на основе отображений между интерфейсами и конкретными типами.

Это позволит вам запрашивать абстрактный тип из контейнера:

IFoo f = container.Resolve<IFoo>();

Для этого необходимо, чтобы вы ранее настроили контейнер для отображения из IFoo в конкретный класс, который реализует IFoo (например, Foo).

Само по себе это не будет особенно впечатляющимКонтейнеры DI делают больше:

  • Они используют Auto-Wiring , что означает, что они могут автоматически выяснить, что если IFoo сопоставляется с Foo, а IBar сопоставляется с Bar, но Foo имеетВ зависимости от IBar, он создаст экземпляр Foo с Bar при запросе IFoo.
  • Они управляют продолжительностью жизни компонентов.Многие каждый раз хотят новый экземпляр Foo, но в других случаях вам может понадобиться тот же экземпляр.Вы можете даже захотеть каждый раз новые экземпляры Foo, но добавленный столбец должен оставаться тем же экземпляром.

Как только вы начнете пытаться вручную управлять составом и сроком жизни Вы должны начать ценить услуги, предоставляемые DI-контейнером:)

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

Когда дело доходит до правильного использования контейнеров, Кшиштоф Козьмич только что опубликовал хороший обзор .

4 голосов
/ 22 июня 2010

" Это не что иное, как необычная хеш-таблица объектов. "

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

Их использование делает его легче и чище, когдаречь идет о подключении зависимостей.Представьте, что у вас есть следующие псевдо-классы.

class House(Kitchen, Bedroom)
     // Use kitchen and bedroom.
end

class Kitchen()
    // Code...
end

class Bedroom()
   // Code...
end

Строительство дома - это боль без контейнера DI, вам необходимо создать экземпляр спальни, а затем экземпляр кухни.Если бы у этих объектов тоже были зависимости, вам нужно было их подключить.В свою очередь, вы можете потратить много строк кода, просто подключая объекты.Только тогда вы сможете создать настоящий дом.Используя контейнер DI / IOC (Inversion of Control), вы говорите, что хотите получить домашний объект, контейнер DI будет рекурсивно создавать каждую из его зависимостей и возвращать вам дом.

Без контейнера DI / IOC:

house = new House(new Kitchen(), new Bedroom());

С контейнером DI / IOC:

house = // some method of getting the house

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

2 голосов
/ 22 июня 2010

Контейнер DI настраивается таким образом, чтобы он знал о ваших интерфейсах и типах - как каждый интерфейс отображается на тип.

Когда вы вызываете Resolve для него, он смотрит на отображение и возвращает сопоставленный объектВы запросили.

Некоторые контейнеры DI используют соглашения о конфигурации, где, например, если вы определяете интерфейс ISomething, он будет искать конкретный тип Something для создания и возврата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...