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

У меня есть следующее определение интерфейса:

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

У меня есть несколько реализаций, которые реализуют ICommandHandler и должны быть решены. В то время как Castle Windows автоматически внедряет свойство Logger, когда ILogger вводится, я не могу найти способ настроить свойство SendAsync таким образом, чтобы Windsor установило для него значение true при создании новых экземпляров.

UPDATE

Обработчики команд реализуют общий интерфейс, который наследуется от базового интерфейса:

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

Вот моя конфигурация:

var container = new WindsorContainer();

container.Register(Component
     .For<ICommandHandler<CustomerMovedCommand>>()
     .ImplementedBy<CustomerMovedHandler>());
container.Register(Component
     .For<ICommandHandler<ProcessOrderCommand>>()
     .ImplementedBy<ProcessOrderHandler>());
container.Register(Component
     .For<ICommandHandler<CustomerLeftCommand>>()
     .ImplementedBy<CustomerLeftHandler>());

Как можно это сделать с Виндзорским замком?

1 Ответ

8 голосов
/ 20 апреля 2011
.DependsOn(Proprerty.ForKey("sendAsync").Eq(true))

или с анонимным типом

.DependsOn(new{ sendAsync = true })

относительно обновленного вопроса, кажется, вам нужно следующее:

container.Register(AllTypes.FromThisAssembly()
   .BasedOn(typeof(ICommandHandler<>))
   .WithService.Base()
   .Configure(c => c.DependsOn(new{ sendAsync = true })
                    .Lifestyle.Transient));

Таким образом, вы регистрируете и настраиваете все обработчики за один раз, и по мере добавления новых вам не нужно возвращаться, чтобы добавить их в регистрационный код.

Я предлагаю прочитать документацию , так как API регистрации на основе соглашений намного больше, чем этот.

...