2011-04-20 3 views
5

En relation avec cette question, mais cette question concerne StructureMap.StructureMap: Injecter une propriété primitive dans une classe de base

J'ai la définition d'interface suivante:

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

J'ai plusieurs implémentations qui mettent en œuvre ICommandHandler et doivent être résolus. Je souhaite injecter automatiquement ces deux propriétés dans les instances qui implémentent ICommandHandler.

J'ai trouvé un moyen de faire injecter le ILogger en laissant toutes les implémentations héritent d'un type de base et l'attribut [SetterProperty]: ne me aide pas

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

    public bool SendAsync { get; set; } 
} 

Ceci, cependant, avec l'injection du type bool primitive dans tous les implémentations.

Les gestionnaires de commandes implémenter une interface générique qui hérite de l'interface de base:

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

Voici ma configuration actuelle:

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. 

Comme vous pouvez le voir, je mis la propriété pour chacun et chaque configuration, ce qui est assez lourd (cependant, il est assez agréable que le SetProperty accepte un délégué Action<T>).

Quelles sont les façons de faire cela plus efficacement avec StructureMap?

Répondre

2

Peut-être pourriez-vous utiliser ceci?

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

Deux pouces pour vous! Merci beaucoup. – Steven

Questions connexes