Я смотрел на внедрение терминов и внедрение зависимостей, просматривая статьи по шаблонам проектирования (локатор служб).
Когда я гуглил о внедрении конструктора, я получил неясные результаты, что побудило меня проверить здесь.
Что такое инжектор конструктора? Это особый тип внедрения зависимости? Канонический пример был бы очень полезен!
редактировать
Пересматривая эти вопросы после перерыва в неделю, я вижу, как я потерял ... На всякий случай, если кто-нибудь еще появится здесь, я обновлю тело вопроса, немного узнав о себе. Пожалуйста, не стесняйтесь комментировать / исправить. Внедрение в конструктор и вложение свойств - это два типа внедрения зависимостей.
c#
dependency-injection
TheSilverBullet
источник
источник
Ответы:
Я не эксперт, но я думаю, что могу помочь. И да, это особый тип внедрения зависимостей.
Отказ от ответственности: почти все это было «украдено» из Ninject Wiki
Давайте рассмотрим идею внедрения зависимости, пройдя простой пример. Допустим, вы пишете следующую блокбастерскую игру, в которой благородные воины сражаются за великую славу. Во-первых, нам понадобится оружие, подходящее для вооружения наших воинов.
Тогда давайте создадим класс для представления самих наших воинов. Чтобы атаковать своих противников, воину понадобится метод Attack (). Когда этот метод вызывается, он должен использовать свой меч, чтобы поразить своего противника.
Теперь мы можем создать нашего самурая и сражаться!
Как вы можете себе представить, это будет печатать рубленых злодеев чистыми пополам к консоли. Это прекрасно работает, но что если мы захотим вооружить нашего самурая другим оружием? Поскольку Sword создается внутри конструктора класса Samurai, мы должны изменить реализацию класса, чтобы внести это изменение.
Когда класс зависит от конкретной зависимости, говорят, что он тесно связан с этим классом . В этом примере класс самураев тесно связан с классом меча. Когда классы тесно связаны, они не могут быть заменены без изменения их реализации. Чтобы избежать тесной связи классов, мы можем использовать интерфейсы для обеспечения уровня косвенности. Давайте создадим интерфейс для представления оружия в нашей игре.
Затем наш класс Sword может реализовать этот интерфейс:
И мы можем изменить наш класс самураев:
Теперь наш самурай может быть вооружен разным оружием. Но ждать! Меч все еще создается внутри конструктора Самурая. Поскольку нам все еще нужно изменить реализацию Самурая, чтобы дать нашему воину другое оружие, Самурай все еще тесно связан с Мечом.
К счастью, есть простое решение. Вместо того, чтобы создавать Меч из конструктора Самурая, мы можем вместо этого выставить его как параметр конструктора. Также известный как Конструктор Инъекция.
Как отметил Джорджио, существует также инъекция свойств. Это было бы что-то вроде:
Надеюсь это поможет.
источник
Я постараюсь как можно больше сделать это очень элементарно. Таким образом, вы можете опираться на концепцию и создавать свои собственные сложные решения или идеи.
Теперь представьте, что у нас есть церковь под названием Юбилейная, которая имеет филиалы по всему миру. Наша цель - просто получить предмет из каждой ветки. Здесь было бы решение с DI;
1) Создать интерфейс IJubilee:
2) Создайте класс JubileeDI, который будет принимать интерфейс IJubilee в качестве конструктора и возвращать элемент:
3) Теперь создайте три ветки Jubilee, а именно JubileeGT, JubileeHOG, JubileeCOV, которые все ДОЛЖНЫ наследовать интерфейс IJubilee. Ради удовольствия заставьте одного из них реализовать свой метод как виртуальный:
4) Вот и все! Теперь давайте посмотрим на DI в действии:
Для каждого экземпляра класса контейнера мы передаем новый экземпляр класса, который нам нужен, что обеспечивает слабую связь.
Надеюсь, это объясняет концепцию в двух словах.
источник
Предположим, у вас есть класс,
A
каждому экземпляру которого требуется экземпляр другого классаB
.Внедрение зависимостей означает, что ссылка на
B
устанавливается объектом, который управляет экземпляромA
(в отличие от того, чтобы классA
управлял ссылкойB
непосредственно).Внедрение в конструктор означает, что ссылка на конструктор
B
передается в качестве параметраA
и устанавливается в конструкторе:Альтернативой является использование метода установщика (или свойства) для установки ссылки
B
. В этом случае объект , который управляет экземплярa
изA
должен сначала вызвать конструктор ,A
а затем вызвать метод установки , чтобы установить переменную - член ,A.b
прежде чемa
будет использоваться. Метод последней инъекции необходим , когда объекты содержат циклические ссылки друг на друг, например , если экземплярb
изB
который установлен в экземпляреa
изA
содержит обратную ссылку наa
.** РЕДАКТИРОВАТЬ**
Вот еще несколько деталей, чтобы обратиться к комментарию.
1. Класс A управляет экземпляром B
2. B экземпляр устанавливается в конструкторе
3. B экземпляр устанавливается с помощью метода установки
источник
itemA
илиobjectA
просто, чтобы сделать имя длиннее, не всегда лучше.