2016-06-17 24 views
0

私はCastel Windsor登録でCommandとCommandHandlerを使用しています。いくつかの例があります:Castle 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インターフェースも実装しています。では、どうすれば汎用コマンドハンドラを正しく登録できますか?

更新:城SoftRemoveCommandHandler<SoftRemoveCommand<T>>なくSoftRemoveCommandHandler<T>を解決しようとしていると、それは "プロキシないクーロン" 例外をスロー

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

WithService.Baseを追加した後。

城を解決することは可能ですかSoftRemoveCommandHandler<T>ではなく、SoftRemoveCommandHandler<SoftRemoveCommand<T>>ですか?

+1

問題を示すコンパイルコードを投稿してください。たぶん要点? – Marwijn

答えて

0

私はそれをよく理解でき、特にあなたが試している.Resolve<>行を理解できるように、より多くのコードを投稿できますか?

あなたの解決の線は、例えば次のようになります:container.Resolve<ICommandHandler<SoftRemoveCommand<int>>()

私が問題と思うのは、キャッスルがこれを解決しようとしているときに、オープンジェネリックの「1つのレベル」しか知らないということです。これは...BasedOn(typeof(ICommandHandler<>))..です。あなたは城の "内部"レベルを解決するのを助ける必要があります。

This articleこの問題を解決するようです。 Krzysztofの答えとブログを参照してください

関連する問題