Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Объект времени исполнения (Runtime). Все клиенты используют один и тот же объект, который может изменяться во время работы программы.
3. Инжектить в поля — это моветон. Мешает использовать ваш объект без DI фреймворка, и делает зависимости класса менне явными (плюс много черной магии)
но мне понравилась идея автора об отражении зависимости в интерфейсе (пусть и закрытом) класса
Но представьте, что будет, если зависимостей хотя бы штук 5, а конструкторов несколько.
Кроме того, на мой взгляд, логически правильнее отделять зависимости от параметров конструирования.
Это наталкивает меня на мысль что класс отвечает за слишком много вещей
Это значит что у нас точно есть состояние когда объект недособран
Обычно нельзя сказать «Тут проблема дизайна — ничего делать не буду, я работаю только с идеальными решениями. И вообще — давайте все перепишем с нуля!» :)
Нет такого состояния. Все зависимости внедряются вызовами конструкторов полей по умолчанию. Т.е. к началу выполнения тела любого конструктора (и тем более нестатического метода) все будет инициализировано.
Но представьте, что будет, если зависимостей хотя бы штук 5, а конструкторов несколько.Для разрешения этой проблемы придуман паттерн Builder.
#define inject(I, Name)
я бы реализовал в виде класса. В этом случае мы получим уменьшение объема бинарного файла, за счет уменьшения количества различных struct I##Proxy объявленных в разных классах:<class I>
<I>
::Factory {
IProxy<IWork> mWork1;
class Employee
{
public:
Employee(IContainer& cfg) : mWork1(cfg.resolve<IWork>()), mWork2(cfg.resolve<Work2>()) { ... }
private:
IWork* mWork1;
Work2* mWork2;
};
int main()
{
Container cfg;
cfg.RegisterSingleton<IWork, Work1>();
Employee* e = cfg.resolve<Employee>();
// ...
}
Внедрение зависимостей в C++