В связи с этим вопрос , но этот вопрос о 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?