我有一個類的方法如下,我想攔截:使用CustomAttributeMatchingRule
時團結攔截變化調用處理基於方法的註釋
[CustomTag1(Order = 0)]
[CustomTag2(Order = 1)]
public virtual DoSomething()
我如何注入訂單價值爲ICallHandler.Order
財產,?
我不希望將訂單硬編碼到處理程序本身或註冊時。我希望它是方法註釋的Order屬性的變量。
我有一個類的方法如下,我想攔截:使用CustomAttributeMatchingRule
時團結攔截變化調用處理基於方法的註釋
[CustomTag1(Order = 0)]
[CustomTag2(Order = 1)]
public virtual DoSomething()
我如何注入訂單價值爲ICallHandler.Order
財產,?
我不希望將訂單硬編碼到處理程序本身或註冊時。我希望它是方法註釋的Order屬性的變量。
我已經使用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,可以使用自己的自定義屬性實現類似的功能,但由於您不需要創建自己的策略,所以它可以節省時間。
有一點要注意 - 如果你把一個參數化的辦法,你不能有您的呼叫處理程序爲單身的,因爲不同的實例將被創建取決於你想要什麼樣的順序它是在每次
這是。大!感謝您的詳細解答,這非常有幫助。 – Alwyn