2011-08-15 15 views
6

Estoy trabajando en el código heredado.StructureMap Especificación de argumentos de constructor explícitos

Tengo diferentes métodos de la misma clase que pasan diferentes argumentos al constructor de una dependencia. Estoy tratando de introducir algunos usos básicos de la IoC. Ahora mismo tengo StructureMap pasar mis argumentos así:

var thing = ObjectFactory.GetInstance<IThingInterface>(new ExplicitArguments(
     new Dictionary<string, object> { 
      { "constructorArgA", notShown }, 
      { "constructorArgB", redacted.Property } })); 

Donde las propiedades reales pasaron por constructorArgA y B cambian dependiendo de dónde estoy.

En lugar de "constructorArgA" ¿Hay una manera de configurar esto a través de tipos reales, como se puede hacer cuando se configura el objectFactory, como:

x.For<IHidden>().Use<RealType>() 
    .Ctor<IConfig>().Is(new Func<IContext, IConfig>(
     (context) => someMethodToGetIConfig())); 

Si estuviera escribiendo esto desde cero probablemente me estructura las dependencias son un poco diferentes para evitar esto, pero esa no es una opción para mí en este momento.

+0

¿O debería pasar a la inyección de propiedad en lugar de la inyección del constructor? –

Respuesta

3

Esto es algo así como una pregunta clásica/común con DI Containers.

Mi primera opción sería crear una fábrica abstracta "manual" para crear IThingInterface, y luego usar Structuremap para inyectar IThingInterfaceFactory donde sea necesario. Por fábrica manual, me refiero a una clase que llama a nueva ThingInterface() y la devuelve. Si lo hace de esta manera, su implementación ya no estará gestionada por contenedor, y si es tiene dependencias, ya no las proporcionará el contenedor (puede o no ser un problema para usted).

La segunda opción sería crear una fábrica abstracta que realmente use/envuelva el contenedor. Así que, básicamente, su primer fragmento de código, pero envuelto en una clase de fábrica donde el método Create() toma sus parámetros. Esto tiene la ventaja de que todo (incluso su implementación y sus dependencias) se maneja en un contenedor, pero tiene la desventaja de hacer referencia directamente a su contenedor (lo cual no es una buena práctica, consulte Article on Composition Roots).

También podría hacer la inyección setter, pero yo personalmente lo consideraría como último recurso.

Castle Windsor tiene una buena solución para este problema integrado (Typed Factory Facility). No estoy seguro si cambiar contenedores en una opción, pero podría considerarlo.

Cuestiones relacionadas