2012-10-03 22 views
2

我有一個類的方法如下,我想攔截:使用CustomAttributeMatchingRule團結攔截變化調用處理基於方法的註釋

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

我如何注入訂單價值爲ICallHandler.Order財產,?

我不希望將訂單硬編碼到處理程序本身或註冊時。我希望它是方法註釋的Order屬性的變量。

回答

5

我已經使用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!"); 
    } 
} 

請注意,我特意分開兩班,但在現實中你可以有一個類實現兩個ICallHandler接口和HandlerAttribute抽象方法(只返回「this」)。

如果沒有HandlerAttribute,可以使用自己的自定義屬性實現類似的功能,但由於您不需要創建自己的策略,所以它可以節省時間。

有一點要注意 - 如果你把一個參數化的辦法,你不能有您的呼叫處理程序爲單身的,因爲不同的實例將被創建取決於你想要什麼樣的順序它是在每次

+0

這是。大!感謝您的詳細解答,這非常有幫助。 – Alwyn