StructureMap:在基类中注入一个基本属性

本文关键字:一个 属性 基类 注入 StructureMap | 更新日期: 2023-09-27 17:51:24

与这个问题有关,但是这个问题是关于StructureMap的

我得到了以下接口定义:

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

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

我发现了一种注入ILogger的方法,让所有的实现继承一个基本类型和[SetterProperty]属性:

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

然而,这并不能帮助我在所有的实现中注入原语bool类型。

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

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

下面是我当前的配置:

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.

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

有什么方法可以更有效地使用StructureMap?

StructureMap:在基类中注入一个基本属性

也许你可以用这个?

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