私はあなたが何が起こるか誤解されていると思います。 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のように、その方法に結合する問題を抱えているだろうと思い
'Kernel.InterceptReplace(FOO => foo.ThrowsAnError()、...); 'ここに引数を入力する必要があります。そうでなければ、ThrowsAnErrorはN個の引数を必要とするため、コンパイルできません。 'Kernel.InterceptReplace (foo => foo.ThrowsAnError(somehowSatisfyParam1、somehowSatisfyParam2)、...);'私は間違っているかもしれません。 –
Grofit
Grofitが正しければ、 'foo.ThrowsAnError()'は依然としてparamsが指定されることを期待します。 –
@MarkWalsh:Ahh、わかります。私の更新を参照してください。 – Steven