Penso che la tua premessa sia un po 'confusa qui, tu parli di iniettare una fabbrica, ma il modello di fabbrica è un modello di creazione il cui scopo era fare un sottoinsieme di ciò che fa un framework di iniezione di dipendenza, quando i framework DI non erano prevalenti questo schema era utile per quel motivo. Tuttavia, se si dispone di un framework DI, non è più realmente necessario un factory poiché il framework DI può soddisfare lo scopo che la factory avrebbe realizzato.
Detto questo, lasciatemi spiegare un po 'sull'iniezione di dipendenza e su come la usereste generalmente.
Esistono diversi modi per eseguire l'iniezione di dipendenza, ma i più comuni sono l'iniezione del costruttore, l'iniezione di proprietà e il DIContainer diretto. Parlerò dell'iniezione del costruttore poiché l'iniezione di proprietà è l'approccio sbagliato per la maggior parte del tempo (l'approccio giusto qualche volta) e l'accesso a DIContainer non è preferibile, tranne quando non è assolutamente possibile eseguire nessuno degli altri approcci.
L'iniezione del costruttore è dove hai l'interfaccia per una dipendenza e un DIContainer (o fabbrica) che conosce l'implementazione concreta per quella dipendenza, e ovunque tu abbia bisogno di un oggetto che dipende da quell'interfaccia, al momento della costruzione devi consegnare l'implementazione dalla fabbrica a esso.
vale a dire
IDbConnectionProvider connProvider = DIContainer.Get<IDbConnectionProvider>();
IUserRepository userRepo = new UserRepository(connProvider);
User currentUser = userRepo.GetCurrentUser();
Molti framework DI possono semplificare in modo significativo il punto in cui il DIContainer ispezionerà il costruttore di UserRepository per le interfacce per le quali conosce implementazioni concrete e le passerà automaticamente per te; questa tecnica è spesso chiamata Inversion of Control, sebbene DI e IoC siano entrambi termini che vengono scambiati molto e hanno vaghe (se presenti) differenze.
Ora, se ti stai chiedendo come il codice globale acceda al DIContainer, puoi anche avere una classe statica per accedervi o ciò che è più appropriato è che la maggior parte dei framework DI ti consente di rinnovare un DIContainer, in cui si comporterà come un wrapper per un dizionario singleton interno per i tipi che sa essere concreti per determinate interfacce.
Ciò significa che è possibile rinnovare DIContainer ovunque nel codice e ottenere effettivamente lo stesso DIContainer che era già stato configurato per conoscere le relazioni tra interfaccia e calcestruzzo. I mezzi usuali per nascondere il DIContainer da parti del codice che non dovrebbero interagire direttamente con esso è semplicemente garantire che solo i progetti necessari abbiano un riferimento al framework DI.