2016-06-17 7 views
0

Я использую Commands and CommandHandlers с регистрацией Castel Windsor. Есть несколько примеров:Замок Виндзорский комплекс общая регистрация

//command 
public class DeleteEntityComand : ICommand 
    { 
     public int Id { get; set; } 
    } 

//command handler 
public class DeleteEntityCommandHandler : ICommandHandler<DeleteEnityComand> 
    { 
    ... 
    } 

//registrations 
Types.FromAssembly(Assembly.GetAssembly(typeof(DeleteEntityCommandHandler))) 
        .BasedOn(typeof(ICommandHandler<>)) 
        .WithService.AllInterfaces().LifestyleTransient() 

И он отлично работает. Но теперь я хочу использовать универсальный обработчик команд, как это:

//command 
public class SoftRemoveCommand<T> : ICommand 
    { 
     public int Id { get; set; } 
    } 

//command handler 
public class SoftRemoveCommandHandler<T> : ICommandHandler<SoftRemoveCommand<T>> 
    { 
    .. 
    } 

Но, к сожалению, в этом случае предыдущая регистрация не работает. Он пытается решить мой абстрактный BaseCommandHandler, который также реализует интерфейс ICommandHandler. Итак, как я могу правильно зарегистрировать свои общие обработчики команд?

Update:

После добавления WithService.Base:

//registrations 
Types.FromAssembly(Assembly.GetAssembly(typeof(DeleteEntityCommandHandler))) 
        .BasedOn(typeof(ICommandHandler<>)) 
        .WithService.AllInterfaces() 
        .WithService.Base() 
        .LifestyleTransient() 

замок пытается решить SoftRemoveCommandHandler<SoftRemoveCommand<T>>, но не SoftRemoveCommandHandler<T> и он бросает исключение "не кул прокси".

Возможно ли сделать разрешение на застройку SoftRemoveCommandHandler<T>, а не SoftRemoveCommandHandler<SoftRemoveCommand<T>>?

+1

Не могли бы вы опубликовать компилируемую часть кода, которая показывает проблему. Может быть, суть? – Marwijn

ответ

0

Можете ли вы разместить больше своего кода, чтобы я мог лучше понять его и особенно линию .Resolve<>, которую вы пытаетесь.

Я предполагаю, что ваша строка разрешения выглядит примерно так: container.Resolve<ICommandHandler<SoftRemoveCommand<int>>() например.

Что я думаю, проблема в том, что, когда Castle пытается решить это, он знает только «один уровень» открытых дженериков - один из ...BasedOn(typeof(ICommandHandler<>))... Вам нужно помочь замку разрешить «внутренний» уровень.

This article, похоже, решает эту проблему. См. Ответ и блог Krzysztof.