2011-04-20 14 views
5

relacionada con este question, pero esta pregunta es sobre StructureMap.StructureMap: Inyectar una propiedad primitiva en una clase base

Tengo la siguiente definición de interfaz:

public interface ICommandHandler 
{ 
    ILogger Logger { get; set; } 
    bool SendAsync { get; set; } 
} 

tengo varias implementaciones que implementan ICommandHandler y necesitan ser resueltos. Quiero inyectar automáticamente estas dos propiedades en instancias que implementen ICommandHandler.

he encontrado una manera de hacer inyectar el ILogger al permitir que todas las implementaciones heredan de un tipo base y el atributo [SetterProperty]:

public abstract class BaseCommandHandler : ICommandHandler 
{ 
    [SetterProperty] 
    public ILogger Logger { get; set; } 

    public bool SendAsync { get; set; } 
} 

Esto, sin embargo, no me ayuda con la inyección de la primitiva de tipo bool en toda implementaciones.

Los controladores de comandos implementan una interfaz genérica que hereda de la interfaz base:

public interface ICommandHandler<TCommand> : ICommandHandler 
    where TCommand : Command 
{ 
    void Handle(TCommand command); 
} 

Aquí está mi configuración actual:

var container = new Container(); 

container.Configure(r => r 
    .For<ICommandHandler<CustomerMovedCommand>>() 
    .Use<CustomerMovedHandler>() 
    .SetProperty(handler => 
    { 
     handler.SendAsync = true; 
    })); 

container.Configure(r => r 
    .For<ICommandHandler<ProcessOrderCommand>>() 
    .Use<ProcessOrderHandler>() 
    .SetProperty(handler => 
    { 
     handler.SendAsync = true; 
    })); 

container.Configure(r => r 
    .For<ICommandHandler<CustomerLeftCommand>>() 
    .Use<CustomerLeftHandler>() 
    .SetProperty(handler => 
    { 
     handler.SendAsync = true; 
    })); 

// etc. etc. etc. 

Como se puede ver, que establece la propiedad para cada uno y cada configuración, que es bastante engorrosa (sin embargo, es bastante agradable que el SetProperty acepte un delegado Action<T>).

¿De qué manera se puede hacer esto de manera más eficiente con StructureMap?

Respuesta

2

¿Quizás podría usar esto?

container.Configure(r => r.For<ICommandHandler>() 
    .OnCreationForAll(handler => 
    { 
     handler.Logger = container.Resolve<ILogger>(); 
     handler.SendAsync = true; 
    })); 
+0

¡Dos pulgares arriba para usted! Muchas gracias. – Steven

Cuestiones relacionadas