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?
也许你可以用这个?
container.Configure(r => r.For<ICommandHandler>()
.OnCreationForAll(handler =>
{
handler.Logger = container.Resolve<ILogger>();
handler.SendAsync = true;
}));