4

インターセプトしたい次のようなクラスのメソッドがあります。

[CustomTag1(Order = 0)]
[CustomTag2(Order = 1)]
public virtual DoSomething()

ICallHandler.Order使用するときに、注文値をプロパティに挿入するにはどうすればよいCustomAttributeMatchingRuleですか?

注文をハンドラー自体または登録時にハードコーディングしたくありません。メソッドアノテーションのOrderプロパティの変数にしたい。

4

1 に答える 1

7

私はHandlerAttributeを使用してこれを達成しました-一般的に、手動でポリシーを作成する必要がないという理由だけで、Unityの属性スタイルのインターセプトにこれを使用します-代わりに、コードにHandlerAttributeを適用するだけで、Unityは自動的にあなたのためのポリシー。

とにかく、このようなものはおそらくあなたが求めているものです。最初に、パラメータ化することを除いて、通常どおりにコールハンドラを定義します。

public class MyCallHandler : ICallHandler
{
    public MyCallHandler(Int32 value)
    {
        Order = value;
    }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        Console.WriteLine("Parameterised call handler!");
        return getNext()(input, getNext);
    }

    public int Order { get; set; }
}

CustomTagAttributeを使用する代わりに、HandlerAttributeを使用します。-

public class MyHandler : HandlerAttribute
{
    private readonly Int32 value;
    public MyHandler(Int32 value)
    {
        this.value = value;
    }

    public override ICallHandler CreateHandler(IUnityContainer container)
    {
        return new MyCallHandler(value);
    }
}

MyHandlerはクラスに適用されます。CreateHandlerメソッドが呼び出され、その時点でインスタンスMyCallHandlerが作成されます。

public class MyClass
{
    [MyHandler(2)] // Order of 2
    public virtual void Foo()
    {
        Console.WriteLine("Inside method!");
    }
}

2つのクラスを意図的に分離しましたが、実際には、1つのクラスにICallHandlerインターフェイスとHandlerAttribute抽象メソッドの両方を実装させることができます(「this」を返すだけです)。

HandlerAttributeがなくても、独自のカスタム属性を使用して同様のことを実現できる可能性がありますが、独自のポリシーを作成する必要がないため、時間を節約できます。

注意すべき点の1つは、パラメーター化されたアプローチを採用する場合、呼び出しハンドラーをシングルトンにすることはできません。これは、必要な順序に応じて毎回異なるインスタンスが作成されるためです。

于 2012-10-03T23:03:29.620 に答える