StructureMap: внедрение примитивного свойства в базовый класс - PullRequest
5 голосов
/ 20 апреля 2011

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

1 Ответ

2 голосов
/ 21 апреля 2011

Может быть, вы могли бы использовать это?

container.Configure(r => r.For<ICommandHandler>()
    .OnCreationForAll(handler =>
    {
        handler.Logger = container.Resolve<ILogger>();
        handler.SendAsync = true;
    }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...