Просто чтобы расширить ответ @Andy
Внедрение зависимостей — это одна из форм принципа инверсии зависимостей.
Чтобы добиться разделения зависимостей (что обычно встречается в многоуровневой архитектуре), DI обычно используется для сценариев создания экземпляров, таких как базовый new() и шаблоны, такие как метод Factory. В дополнение к возможности вводить новый экземпляр зависимости каждый раз (например, как фабрика), контейнеры также можно настроить для внедрения именованных экземпляров, одноэлементных экземпляров и т. д., т. е. контейнеры IoC обычно также берут на себя ответственность за управление продолжительностью жизни объектов. также.
Один потенциальный «сдвиг мышления» заключается в том, что зависимости теперь потенциально становятся общедоступными для конкретных классов, поскольку DI обычно внедряет через конструкторы или общедоступные свойства Get/Set. Это может показаться странным, если вы привыкли использовать объектно-ориентированную инкапсуляцию, где зависимости класса рассматриваются как реализация и должны быть скрыты от «снаружи», то есть от сигнатур методов класса. Однако, реализуя разделение классов Interface/Concrete (как вы и должны, не только для развязки, но и для целей тестирования/мока), конструкторы внедрения/методы внедрения свойств не будут находиться на интерфейсе, поэтому инкапсуляция снова на месте.
Re: "Выполнение внедрения зависимостей вручную" без Unity и т. д.
Что вам нужно сделать, так это закодировать свой собственный контейнер IoC, который затем отвечает за «создание» экземпляров классов — во время каждого «сборки» вы будете сканировать класс на наличие зависимостей (которые настроены в контейнере, например по конфигурации, по атрибутам или просто по соглашению, например, все общедоступные устанавливаемые свойства или любые параметры класса в конструкторе будут считаться зависимостями). Затем вы должны создать (при необходимости) и внедрить этот экземпляр «зависимости» в объект (например, с помощью отражения). И затем рекурсивно необходимо создать все зависимости этих зависимостей и т. д. Затем вам также потребуется обеспечить управление сроком службы для каждого из объектов, например. Синглтоны и т.д.
person
StuartLC
schedule
03.06.2012