4

メソッドの実行をインターセプトしてキャンセルする方法はありますか?Invokeとを使用してメソッドMicrosoft.Practices.Unityから例外をスローする方法を見つけただけですICallHandlerが、Invokeメソッドの実装では、を返すことしかできませんgetNext()(input, getNext);

基本的にこれはコードです:

public class TestHandler : ICallHandler
{
    public int Order { get; set; }

    public IMethodReturn Invoke(IMethodInvocation input, 
                                GetNextHandlerDelegate getNext)
    {
        Console.WriteLine("It's been intercepted.");

        // Here... please Lord, tell me I can cancel it, I'm a good person.
        return getNext()(input, getNext);
    }
}
4

2 に答える 2

7

キャンセルの意味によって異なります。クライアントコードがメソッドを呼び出し、結果または例外を予期しています。

できることは、ハンドラーで元のメソッドを呼び出さないようにして、パイプラインを効果的に停止することですが、メソッド呼び出しを完了するには何かを行う必要があります。

元のメソッドを含むパイプラインの残りの部分をバイパスするには、IMethodInvocationインターフェイスのCreateMethodReturnメソッドを使用して新しいメソッドリターンを作成し、正常に返すか、CreateExceptionMethodReturnメソッドを使用して例外をスローする必要があります。詳細については、http://msdn.microsoft.com/en-us/library/ee650526( v = pandp.20)を参照してください。

たとえば、する代わりに

return getNext()(input, getNext);

あなたができる

return input.CreateMethodReturn(null, input.Arguments)

nullを返します。

汎用ハンドラーの場合、インターセプトされたメソッドシグネチャを分析して、何を返す必要があるかを把握する必要があります。

于 2012-09-14T21:04:24.653 に答える
3

また、AOPアプローチを検討することをお勧めします。たとえば、PostSharp。さまざまなユースケースに対応する多くの側面があります。詳細はこちら: http: //www.sharpcrafters.comMethodInterceptionAspect をご覧ください

于 2012-09-14T21:52:04.847 に答える