6

傍受のチュートリアルでは、メソッドをターゲットにして傍受することができます。私。Ninjectパラメータを使用したメソッドレベルの傍受

Kernel.Bind<Foo>().ToSelf(); 
Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(), invocation => {}); 

ドキュメント/チュートリアルでは、 ThrowsAnErrorは、パラメータとして文字列を受け入れた場合は、傍受しようとしている方法は、パラメータがすなわちしていることを例に何をすべきかをカバーしていません。私はこのことについて間違った道を進んでいますか私は思っていたのparamsへのアクセスを持っていない結合時に

Kernel.Bind<Foo>().ToSelf(); 
Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(**param goes here**), invocation => {}); 

編集

Working example

答えて

3

私はあなたが何が起こるか誤解されていると思います。 Fooオブジェクトは、インターセプタを含むデコレータに置き換えられます。ここで簡単な例である:すなわち

public class FooDecorator : Foo 
{ 
    private readonly Foo decorated; 

    public FooDecorator(Foo foo) { this.decorated = foo; } 

    public void ThrowsAnError(object param1, int param2) 
    { 
     // calls the decorated instance with supplied parameters 
     this.decorated.ThrowsAnError(param1, param2); 
    } 
} 

、解決fooが呼び出されたときに供給されるパラメータは、装飾されたインスタンスに渡されます。

しかし、これはやや間接的(そして遅い)ですが、概念は同じです。私はNinjectの傍受に慣れていないことを認めなければならないが、オブジェクトにはおそらくProceedメソッドがある。 Expression<Action<T>>として、そのように私はInterceptReplace<T>メソッドの最初の引数は、デリゲートではないことを前提とし

Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(), 
    invocation => 
    { 
     try 
     { 
      // calls the decorated instance with supplied parameters 
      invocation.Proceed(); 
     } 
     catch (Exception ex) 
     { 
      Kernel.Get<ILogger>().Log(ex); 
     } 
    }); 

UPDATE

が、式ツリー:つまり、あなたはこのような何かを行う必要があります。このメソッドは実際には呼び出されませんが、どのメソッドを傍受するかを分析するために分析されます。言い換えれば、メソッドが呼び出されることはないので、あなたは引数を指定することができます。このトリックは、C#コンパイラにどのメソッドのオーバーロードがあるかを知らせることです。あなたがゴミを供給するかどうかは関係ありません。両方の引数が参照型である場合、これはおそらく動作します:

Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(null, null), 
私はあなたがどこから来ている参照が、私はOPのように、その方法に結合する問題を抱えているだろうと思い
+1

'Kernel.InterceptReplace (FOO => foo.ThrowsAnError()、...); 'ここに引数を入力する必要があります。そうでなければ、ThrowsAnErrorはN個の引数を必要とするため、コンパイルできません。 'Kernel.InterceptReplace (foo => foo.ThrowsAnError(somehowSatisfyParam1、somehowSatisfyParam2)、...);'私は間違っているかもしれません。 – Grofit

+1

Grofitが正しければ、 'foo.ThrowsAnError()'は依然としてparamsが指定されることを期待します。 –

+1

@MarkWalsh:Ahh、わかります。私の更新を参照してください。 – Steven

関連する問題