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?
Deux pouces pour vous! Merci beaucoup. – Steven