software patrones patron inyección inyeccion ejemplo diseño dependencias c# dependency-injection inversion-of-control console-application

c# - patrones - Inyección de dependencias y estructura de proyecto para aplicaciones de consola



patrones de diseño de software (1)

Aunque veo una razón para separar el registro de IoC, resolver, liberar desde la implementación de la aplicación, no veo ninguna razón por la cual el contenedor IoC no debería estar en la aplicación de la consola (la raíz de la composición) y la implementación de la aplicación en otro montaje en su lugar.

De esa forma la aplicación de consola es muy fácil:

  1. Crea el contenedor
  2. Cargar la configuración del contenedor
  3. Resolver la aplicación
  4. Ejecutar llamada en la aplicación y pasar los argumentos de la consola junto con
  5. disponer el contenedor cuando la aplicación sale del método de ejecución

Con SM se ve así:

public void Main(params string[] args) { using (var container = new Container()) { container.LoadAllConfigurationModules(); container.AddRegistry<SomeRegistry>(); container.GetInstance<Application>().Run(args); } }

Para cosas que no puede crear al inicio, crea una interfaz de fábrica en su ensamblado de aplicación:

interface ISomeFactory { ISomeDependency CreateSomeDependency() }

e implemente esta interfaz en la aplicación de consola inyectando el contenedor y utilícelo para resolver la instancia. Supongo que la implementación SM se ve así:

public class SomeFactory : ISomeFactory { public SomeFactory(IContainer sontainer) { this.container = container; } ISomeDependency CreateSomeDependency() { this.container.GetInstance<ISomeDependency>(); } }

Otro contenedor IoC incluso tiene la función de implementar estas fábricas de interfaz automáticamente.

Tengo 4 proyectos:

Core (IServer):

  • Sistema
  • System.Core

DependencyResolver:

  • Núcleo
  • StructureMap

Infraestructura (Servicio):

  • Núcleo
  • Dependencia externa

Consola:

  • Núcleo
  • DependencyResolver

Requisitos:

Intento usar StructureMap solo en DependencyResolver. Además, la aplicación de la Consola no debería saber nada sobre Infrastucture.

Cuando no quiero hacer referencia a StructureMap en mi aplicación de consola, tengo que construir un ServiceLocator.

En DependencyResolver tengo un Bootstrapper que es responsable de llamar al material de registro de StructureMap (Register)

En mi aplicación de consola, quiero obtener una instancia. Para esto necesito hacer referencia a StructureMap. Otra forma sería escribir una pequeña envoltura alrededor de los métodos de resolución de StructureMaps.

¿Hay alguna otra forma mejor de desacoplar la consola de StructureMap?