Creo que su premisa está un poco confundida aquí, usted habla de inyectar una fábrica, pero el patrón de fábrica es un patrón de creación cuyo propósito era hacer un subconjunto de lo que hace un marco de inyección de dependencia, cuando los marcos DI no prevalecían. útil por esa razón. Sin embargo, si tiene un marco DI, ya no necesita realmente una fábrica, ya que el marco DI puede cumplir el propósito que la fábrica habría cumplido.
Dicho esto, déjame explicarte un poco sobre la inyección de dependencia y cómo la usarías en general.
Hay una variedad de formas de hacer una inyección de dependencia, pero las más comunes son la inyección de constructor, la inyección de propiedades y el DIContainer directo. Hablaré sobre la inyección de constructores, ya que la inyección de propiedades es el enfoque incorrecto la mayoría de las veces (el enfoque correcto algunas veces), y el acceso a DIContainer no es preferible, excepto cuando absolutamente no puede hacer ninguno de los otros enfoques.
La inyección de constructor es donde tiene la interfaz para una dependencia y un DIContainer (o fábrica) que conoce la implementación concreta para esa dependencia, y cuando necesite un objeto que dependa de esa interfaz, en el momento de la construcción entrega la implementación de la fábrica a eso.
es decir
IDbConnectionProvider connProvider = DIContainer.Get<IDbConnectionProvider>();
IUserRepository userRepo = new UserRepository(connProvider);
User currentUser = userRepo.GetCurrentUser();
Muchos marcos DI pueden simplificar esto significativamente a donde su DIContainer inspeccionará el constructor de UserRepository para las interfaces para las que conoce implementaciones concretas, y las entregará automáticamente por usted; Esta técnica se llama frecuentemente Inversión de control, aunque DI e IoC son términos que se intercambian mucho y tienen diferencias vagas (si las hay).
Ahora, si se pregunta cómo el código general accede al DIContainer, bien puede tener una clase estática para acceder a él o lo que es más apropiado es que la mayoría de los marcos DI le permiten renovar un DIContainer, en el que en realidad solo se comportará como un contenedor a un diccionario singleton interno para los tipos que sabe que son concretos para interfaces dadas.
Eso significa que puede renovar el DIContainer en cualquier lugar que desee en el código y obtener efectivamente el mismo DIContainer que ya había configurado para conocer sus relaciones de interfaz a concreto. Los medios habituales para ocultar el DIContainer de partes del código que no deberían interactuar directamente con él es simplemente asegurarse de que solo los proyectos necesarios tengan una referencia al marco DI.