В приложении, которое использует Dependency Injection можно выделить 2 "области":
- Composition Root
- Остальное приложение
Composition Root - это место в котором собираются все зависимости воедино. О всех реализациях зависимостей должен знать только он.
Остальное приложение - это (тафтология) все остальное приложение. Они используют только интерфейсы и другие абстрации.
Обычно Composition Root - это входная точка приложения. В нем создается эта самая ServiceFactoryImpl (стандартные реализации, из конфигурации могут быть прочитаны флаги, создан в зависимости от платформы и т.д.), а затем как интерфейс IServiceFactory, передается в остальные места.
Т.е. в коде это будет как-то так
#include <IServiceFactory.h>
class Sample {
private:
IServiceFactory _factory;
public:
Sample(IServiceFactory factory): _factory(factory) { }
DoSomething() {
auto service = _factory.CreateService();
service.MakeStuff();
}
}
int main() {
auto factory = ServiceFactoryImpl(); // Читаем конфигурацию, параметры ОС и др.
auto sample = Sample(factory);
sample.DoSomething();
}