2014-03-31 80 views
2

我使用基於此Link的CQRS並使用SimpleInjector來啓動裝飾器。但他們沒有被解僱。我在這裏做錯了什麼?SimpleInjector - 裝飾者不開火?

這裏是我的ICommandHandler部分:

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

public interface ICommandHandler<TCommand, TResult> : ICommandHandler<TCommand> 
    where TCommand : Command<TResult> 
{ 
} 

而且BaseCommandHandler部分:

public abstract class BaseCommandHandler<TCommand> 
    : ICommandHandler<TCommand> where TCommand : Command 
{ 
    public DbEntities Db { get; set; } 

    public BaseCommandHandler(DbEntities db) 
    { 
     Db = db; 
    } 

    public BaseCommandHandler() : this(new DbEntities()) 
    {    
    } 

    public abstract void Handle(TCommand command); 
} 

public abstract class BaseCommandHandler<TCommand, TResult> 
    : BaseCommandHandler<TCommand> 
    where TCommand : Command<TResult> 
{  
} 

SimpleInjector配置

container.RegisterManyForOpenGeneric(typeof(ICommandHandler<>), 
    typeof(BaseCommandHandler<>).Assembly); 
container.RegisterDecorator(typeof(ICommandHandler<>), 
    typeof(LoggerCommandHandlerDecorator<Command>)); 
container.RegisterDecorator(typeof(ICommandHandler<>), 
    typeof(ValidationCommandHandlerDecorator<Command>)); 

注意:ICommandHandler和BaseCommandHandler都駐留在不同的庫程序集中。這是有目的地完成的。

任何幫助將不勝感激!

回答

2

您註冊了兩個封閉通用裝飾器,而不是開放式通用類型。這是你的掛號:

container.RegisterDecorator(typeof(ICommandHandler<>), 
    typeof(LoggerCommandHandlerDecorator<Command>)); 

什麼這個配置說的是,對於每一個ICommandHandler<T>實現,它解決了,儘量在可能的情況與LoggerCommandHandlerDecorator<Command>把它包起來。但是,由於您提供了關閉的LoggerCommandHandlerDecorator<Command>,因此它只能應用於ICommandHandler<Command>實現,但不能應用於任何子類型的命令,例如ICommandHandler<MoveCustomerCommand>

這是不可能的原因,是因爲當有人要求ICommandHandler<MoveCustomerCommand>時,它期望執行這種類型,但LoggerCommandHandlerDecorator<Command>不執行ICommandHandler<MoveCustomerCommand>;它只實現了ICommandHandler<Command>。所以,雖然LoggerCommandHandlerDecorator<Command>可以換一個ICommandHandler<MoveCustomerCommand>,但不能退貨。這將導致InvalidCastException

因此,這應該是你的註冊:

container.RegisterDecorator(typeof(ICommandHandler<>), 
    typeof(LoggerCommandHandlerDecorator<>)); 
+0

曾爲喜歡一個魅力!感謝您的詳細解答。 – Ali