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?
也许你可以用这个?
container.Configure(r => r.For<ICommandHandler>()
.OnCreationForAll(handler =>
{
handler.Logger = container.Resolve<ILogger>();
handler.SendAsync = true;
}));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1475 次 |
| 最近记录: |