StructureMap:在基类中注入原始属性

Ste*_*ven 5 .net c# structuremap dependency-injection ioc-container

与此问题相关,但这个问题与StructureMap有关.

我有以下接口定义:

public interface ICommandHandler
{
    ILogger Logger { get; set; }
    bool SendAsync { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有多个实现,ICommandHandler需要解决.我想在实现的实例中自动注入这两个属性ICommandHandler.

我找到了一种方法来执行注入ILogger,让所有实现都从基类型和[SetterProperty]属性继承:

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

    public bool SendAsync { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然而,这并没有帮助我bool在所有实现中注入基本类型.

命令处理程序实现从基接口继承的通用接口:

public interface ICommandHandler<TCommand> : ICommandHandler
    where TCommand : Command
{
     void Handle(TCommand command);
}
Run Code Online (Sandbox Code Playgroud)

这是我目前的配置:

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.
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我为每个配置设置了属性,这非常麻烦(但是,SetProperty接受Action<T>委托是非常好的).

有哪些方法可以更有效地使用StructureMap?

Fra*_*čik 3

也许你可以用这个?

container.Configure(r => r.For<ICommandHandler>()
    .OnCreationForAll(handler =>
    {
        handler.Logger = container.Resolve<ILogger>();
        handler.SendAsync = true;
    }));
Run Code Online (Sandbox Code Playgroud)