2015-04-14 1 views
3

Я пытаюсь украсить мои обработчики команд, используя замок windsor, но кажется, что мои регистрации неверны, поскольку класс не оформлен.Регистрация родовых декораторов в замке виндзора?

У меня есть следующие установки:

internal class CommandsInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(
      Component.For<IDbConnection>() 
       .UsingFactoryMethod(() => ConnectionHelper.GetOpenDbConnection(Connection.DatabaseName.ReedOnline)) 
       .LifestylePerWebRequest()); 

     container.Register(
      Classes 
       .FromAssemblyContaining<EcruiterCommands>() 
       .Where(t => t.Name.EndsWith("Commands")) 
       .WithService 
       .AllInterfaces().LifestylePerWebRequest()); 

     container.Register(
      Classes 
       .FromAssemblyContaining<EcruiterCommands>() 
       .Where(t => t.Name.EndsWith("CommandHandler")) 
       .WithService.AllInterfaces() 
       .LifestylePerWebRequest()); 

     container.Register(Component.For(typeof (ICommandHandler<>)) 
      .ImplementedBy(typeof (TransactionCommandHandlerDecorator<>)) 
      .IsDefault() 
      .LifestylePerWebRequest()); 

     container.Register(Component.For(typeof (ICommandHandler<>)) 
      .ImplementedBy(typeof (ExceptionHandlingCommandHandlerDecorator<>)) 
      .IsDefault() 
      .LifestylePerWebRequest());    
    } 
} 

и это мой декоратор:

namespace TempSearch.Ioc.Decorators.CommandHandlers 
{ 
    public class TransactionCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand> 
    { 
     private readonly ICommandHandler<TCommand> decorated; 

     public TransactionCommandHandlerDecorator(ICommandHandler<TCommand> decorated) 
     { 
      this.decorated = decorated; 
     } 

     public void Handle(TCommand command) 
     { 
      using (var scope = new TransactionScope()) 
      { 
       decorated.Handle(command); 
       scope.Complete(); 
      } 
     } 
    } 
} 

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

Component TempSearch.Command.Data.Decorators.TransactionCommandHandlerDecorator`1 could not be registered. 
There is already a component with that name. 
Did you want to modify the existing component instead? 
If not, make sure you specify a unique name. 
+1

«У меня есть трудности» «Какая это будет трудность? Также постарайтесь придерживаться одного вопроса за сообщение. –

+0

@PatrickQuirk прав. Я попробовал ответить на ваш вопрос об декораторах, прежде чем начать редактирование. Пожалуйста, откат и откройте другой вопрос, а не – samy

+1

. Я открыл еще один вопрос здесь: http://stackoverflow.com/questions/29627510/castle-windsor-instances-are-registered-as-singleton-even-though-explicitly-decl – Xerxes

ответ

1

первой, что касается «уже зарегистрированы» ошибки, вы регистрации вашего компонента дважды

container.Register(
    Classes 
     .FromAssemblyContaining<EcruiterCommands>() 
     .BasedOn(typeof (ICommandHandler<>)) 
     .WithService.AllInterfaces() 
     .LifestylePerWebRequest()); 

Это регистрирует все классы, которые основаны на ICommandHandler<>, так TransactionCommandHandlerDecorator уже зарегистрирован

что касается шаблона декоратора вы собираетесь за, я бы реализовать его с помощью замок interceptors. Я обнаружил, что у декораторов есть not very easy, чтобы сделать в Замке; связанный ответ довольно старый, и с тех пор замок изменился, поэтому я могу ошибаться, но перехватчики - это то, что вы хотите.

+0

Я попытался явно привязать экземпляры, у которых «CommandHandler» в конце этого пытался, но он все еще не работает, никаких идей? – Xerxes

+0

Помимо того, что я уже писал не намного больше. Вы можете посмотреть регистрацию заказа, чтобы узнать, помогает ли она настроить декоратор, но я бы пошел с перехватчиком – samy

+0

@Xerxes: Если вы прочитаете ответы Krzysztof Kozmic здесь, в Stackoverflow о применении родовых декораторов в Castle Windsor, вы обнаружите, что поддержка замка этих ограниченных советов и советов Кшиштофа использует вместо этого перехват.Это, конечно, не очень удовлетворительный ответ, потому что перехват заставляет ваш код зависеть от библиотеки перехвата и приводит к значительно более читабельному коду, гораздо менее удобному для пользователя. – Steven

Смежные вопросы