2011-02-09 20 views
4

Ninject Interception拡張機能を使用しています。 Ian Davis's blog postは、インターセプトが常にインターフェイスではなく実際のサービスタイプに基づいていることを示します。 Foo.DoSomethingvirtualある場合 Ninject Interception Extensionのインターセプトインターフェイスメソッド

Kernel.InterceptBefore<IFoo>(f => f.DoSomething(), 
    i => Console.WriteLine("before")); 

そしてもちろんの

は、次のコード片はのみ動作します:

Kernel.InterceptBefore<Foo>(f => f.DoSomething(), 
    i => Console.WriteLine("before")); 

これはのように思えるIFooはインタフェースであるため、例えば、次のコードでは効果がありませんアスペクト指向のプログラミングでは、かなり目立たない穴です。私はインターフェイスにプログラミングすることについてかなり慎重だったので、さまざまなサービスを模擬するために模擬フレームワークを使うことができましたが、実際のメソッド実装の大半は仮想ではありません。模倣しているフレームワークが私が求めている方法でIFooを生成できるなら、Ninjectができるはずです。

だから私は、私の質問は二つあると思う?

  1. はNinjectインターセプトはあなたがメソッドをインターフェイスにバインドすることはできません何らかの理由がありますか
  2. Ninjectバインドをダイナミックな「ラッパー」クラスにバインドさせて、すべてのインターフェイスメソッドで特定のインターセプトアクションを実行させ、呼び出しを実際の実装に渡せるようにする簡単な方法はありますか?

答えて

5

私はこれをいくつかスパイクしましたが、その動作をインターセプト拡張にすることは可能です。しかし、近い将来に2.2リリースを予定しているので、あなたはちょっとした患者でなければなりません。私はdefenately変更を好むので、私は2.4に追加する予定です。また、スパイクは生産性から遠いです。すべての現在の単体テストが実行されています。しかし、この機能を追加する必要がある新しいものがたくさんあります。もしあなたが好きなら、私はあなたにパッチを送ることができますが、現時点ではバグフリーであることをあなたに保証することはありません。

+0

ありがとう、レモ。私はこれについて非常に患者になることができます。私たちのプロジェクトで重要なことは、この機能に依存しません。私はNinjectでやってきた素晴らしい仕事と、ユーザーコミュニティに提供する迅速で一貫した反応に感謝します。あなたがこれをサポートするために何かできることがあれば教えてください。 – StriplingWarrior

+1

これはまだ実装されていますか? – mac10688