標籤:c# intercept 訊息攔截器 aop
首先,我們先要製作一個自訂Attribute,讓他可以具有上下文讀取功能,所以我們這個Attribute類要同時繼承Attribute和IContextAttribute。
介面IContextAttribute中有兩個方法需要實現
1、bool IsContextOK(Context ctx, IConstructionCallMessage msg);
2、void GetPropertiesForNewContext(IConstructionCallMessage msg);
簡單解釋一下這兩個方法:
1、IsContextOK方法是讓我們檢查當前上下文(current context)是否有問題,如果沒有問題返回true,有問題的話返回false,然後該類會去調用GetPropertiesForNewContext
2、GetPropertiesForNewContext 是 系統會自動new一個context ,然後讓我們去做些新環境應該做的事。
/// <summary> /// Some class if you want to intercept,you must mark this attribute. /// </summary> public class InterceptAttribute : Attribute, IContextAttribute { public InterceptAttribute() { Console.WriteLine(" Call 'InterceptAttribute' - 'Constructor' "); } public void GetPropertiesForNewContext(IConstructionCallMessage ctorMsg) { ctorMsg.ContextProperties.Add(new InterceptProperty()); } public bool IsContextOK(Context ctx, IConstructionCallMessage ctorMsg) { InterceptProperty interceptObject = ctx.GetProperty("Intercept") as InterceptProperty; return interceptObject != null; } }
ok,這是這個類的實現,要解釋幾點:
1、InterceptAttribute這個類繼承的是Attribute,用於[Attribute]標記用的。
2、InterceptAttribute這個類繼承IContextAttribute,用於給標記上的類獲得上下文許可權,然後要實現該介面的兩個方法。
3、IsContextOK方法是去判斷當前是否有“Intercept”這個屬性,因為我們只需要這個屬性,所以只要檢查這個屬性當前上下文有沒有即可,如果有返回true,沒有的話會調用GetPropertiesForNewContext函數。
(我們這裡只做攔截器功能,所以只添加Intercept自訂屬性,當然如果有需要可以添加多個屬性,然後在這個函數中進行相應檢查)
4、如果調用GetPropertiesForNewContext函數,他會讓我們進行新上下文環境的自訂,我在這做了一個操作:在當前的上下文中添加一個屬性,這個屬性就是Intercept。
5、下一章我會實現InterceptProperty這個類,其實這個類就是一個內容屬性。