したがって、Ninjectを介してメッセージハンドラーをインスタンス化するメッセージバスがあります。ロギング、トランザクション管理などの横断的関心事でハンドラーを装飾したいと思います。
バインディングを次のように設定します。
kernel.Bind<IMessageHandler<int>>().To<IntHandlerOne>()
.WhenInjectedInto(typeof(HandlerDecorator<>));
kernel.Bind(typeof(IMessageHandler<>)).To(typeof(HandlerDecorator<>));
これは、特定のメッセージタイプのハンドラーが1つある場合はいつでも素晴らしく機能します。ただし、複数のハンドラーを定義している場合:
kernel.Bind<IMessageHandler<int>>().To<IntHandlerOne>()
.WhenInjectedInto(typeof(HandlerDecorator<>));
kernel.Bind<IMessageHandler<int>>().To<IntHandlerTwo>()
.WhenInjectedInto(typeof(HandlerDecorator<>));
kernel.Bind(typeof(IMessageHandler<>)).To(typeof(HandlerDecorator<>));
Ninjectは、デコレータを見つけてメッセージバスに注入し、その後、両方のハンドラをデコレータコンストラクタに注入しようとしますが失敗します。
public HandlerDecorator(IMessageHandler<T> handler)
ハンドラーのリストを受け入れるようにデコレーターを変更してみませんか?私はこれについて考えました、しかしそれはハンドラーの目的を打ち負かします。複数のデコレータを簡単に透過的にチェーンできるようにしたいと思います。の各インスタンスはIMessageHandler<T>
、まったく新しいハンドラーのチェーンを取得する必要があります。
ここで話していることを説明するサンプルテストライブラリをGitHubに公開しました。
Ninjectでこれを行う方法はありますか?