Ich denke, Ihre Prämisse ist hier ein wenig verwirrt. Sie sprechen vom Injizieren einer Fabrik, aber das Fabrikmuster ist ein Kreationsmuster, dessen Zweck darin bestand, eine Teilmenge dessen zu tun, was ein Abhängigkeitsinjektionsframework tut, wenn DI-Frameworks nicht vorherrschend waren nützlich aus diesem Grund. Wenn Sie jedoch über ein DI-Framework verfügen, benötigen Sie keine Factory mehr, da das DI-Framework den Zweck erfüllen kann, den die Factory erfüllt hätte.
Lassen Sie mich dennoch ein wenig über die Abhängigkeitsinjektion und deren allgemeine Verwendung erklären.
Es gibt verschiedene Möglichkeiten, eine Abhängigkeitsinjektion durchzuführen. Am häufigsten werden jedoch Konstruktorinjektion, Eigenschaftsinjektion und direkter DIContainer verwendet. Ich werde über die Konstruktorinjektion sprechen, da die Eigenschaftsinjektion die meiste Zeit der falsche Ansatz ist (manchmal der richtige Ansatz) und der DIContainer-Zugriff nicht vorzuziehen ist, es sei denn, Sie können absolut keinen der anderen Ansätze ausführen.
Bei der Konstruktorinjektion haben Sie die Schnittstelle für eine Abhängigkeit und einen DIContainer (oder eine Factory), die die konkrete Implementierung für diese Abhängigkeit kennt, und wo immer Sie ein Objekt benötigen, das von dieser Schnittstelle abhängt, übergeben Sie die Implementierung zur Konstruktionszeit von der Factory an es.
dh
IDbConnectionProvider connProvider = DIContainer.Get<IDbConnectionProvider>();
IUserRepository userRepo = new UserRepository(connProvider);
User currentUser = userRepo.GetCurrentUser();
Viele DI-Frameworks können dies erheblich vereinfachen, indem Ihr DIContainer den Konstruktor von UserRepository auf Schnittstellen überprüft, für die er konkrete Implementierungen kennt, und diese automatisch an Sie weitergibt. Diese Technik wird häufig als Inversion of Control bezeichnet, obwohl DI und IoC Begriffe sind, die häufig ausgetauscht werden und vage (wenn überhaupt) Unterschiede aufweisen.
Wenn Sie sich jetzt fragen, wie der übergreifende Code auf den DIContainer zugreift, können Sie entweder eine statische Klasse für den Zugriff darauf haben oder besser geeignet sein, dass die meisten DI-Frameworks es Ihnen ermöglichen, einen DIContainer neu zu erstellen, bei dem er sich tatsächlich nur so verhält Ein Wrapper für ein internes Singleton-Wörterbuch für die Typen, von denen bekannt ist, dass sie für bestimmte Schnittstellen konkret sind.
Das heißt, Sie können den DIContainer an einer beliebigen Stelle im Code neu erstellen und effektiv denselben DIContainer erhalten, den Sie bereits konfiguriert haben, um Ihre Beziehungen zwischen Schnittstelle und Beton zu kennen. Das übliche Mittel, um den DIContainer vor Teilen des Codes zu verbergen, die nicht direkt mit ihm interagieren sollten, besteht darin, einfach sicherzustellen, dass nur die erforderlichen Projekte einen Verweis auf das DI-Framework haben.