轉(zhuǎn)帖|其它|編輯:郝浩|2009-04-01 10:08:46.000|閱讀 537 次
概述:簡單的介紹下框架中用到的一些接口和屬性。昨天把我們關(guān)注的切面分成了三類
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
已經(jīng)9點(diǎn)了,就不廢話了,直接開講,今天就簡單的介紹下框架中用到的一些接口和屬性。昨天把我們關(guān)注的切面分成了三類,現(xiàn)在給出這3個接口的定義:
l 繼承IPreProcess接口可以實(shí)現(xiàn)對方法執(zhí)行前的處理,該方法傳入一個MethodContext對象,里面包含了方法執(zhí)行時的一些上下文信息,然后返回一個bool值,指示是否繼續(xù)執(zhí)行下面的方法;
l 繼承IPostProcess接口可以實(shí)現(xiàn)方法執(zhí)行后的處理,同樣傳入一個MethodContext對象,與之前不同的是,這次的MethodContext對象中還設(shè)置了真正的方法體執(zhí)行后所得到的結(jié)果,用于進(jìn)行一些后續(xù)的處理;
l 繼承IExceptionHandler接口可以實(shí)現(xiàn)在方法發(fā)生異常時的異常處理,該方法中比上面兩個方法多了一個Exception參數(shù),該參數(shù)表示截獲到的異常信息。
對于任意一個接口,每個方法都可以有不止一個的處理程序,框架將按照在配置文件中定義的順序依次調(diào)用執(zhí)行。下面給出一個進(jìn)行方法植入后的偽代碼示例:
public virtual void Test1(string text1)
{
MethodContext context;
try
{
//調(diào)用預(yù)處理程序
if (_addPreProcessLog.PreProcess(context))
{
//調(diào)用真正的方法
base.Test1(text1);
//調(diào)用事后處理程序
_addPostProcessLog.PostProcess(context);
}
}
catch (Exception exception)
{
//調(diào)用異常處理程序
_simplyExceptionHandler.ProcessException(context, exception);
}
}
接下來介紹一下MethodContext類,這個類里面定義了方法執(zhí)行時的一些上下文信息,現(xiàn)在有方法的信息、方法調(diào)用時傳入的參數(shù)、方法的返回值,本來還有方法的調(diào)用者,后來感覺沒什么用,又去掉了,我暫時只能想到這些信息,大家如果有好的意見,希望能在文后留言,感激的話就不說了,共同進(jìn)步嘛,下面給出類的定義:
/// <summary>
/// 方法執(zhí)行時的上下文
/// </summary>
public class MethodContext : MarshalByRefObject
{
#region Properties
private MethodInfo _methodInfo;
/// <summary>
/// 方法的信息
/// </summary>
public MethodInfo MethodInfo
{
get { return _methodInfo; }
set { _methodInfo = value; }
}
private object[] _arguments;
/// <summary>
/// 方法調(diào)用時傳入的參數(shù)
/// </summary>
public object[] Arguments
{
get { return _arguments; }
set { _arguments = value; }
}
private object _result;
/// <summary>
/// 方法的返回值,如果有
/// </summary>
public object Result
{
get { return _result; }
set { _result = value; }
}
#endregion
#region Ctor
public MethodContext()
{
}
public MethodContext(MethodInfo methodInfo, object[] paras)
{
_methodInfo = methodInfo;
_arguments = paras;
}
#endregion
}
今天最后要講的就是昨天在給出的示例中所使用的屬性(感覺叫特性比較不容易搞錯),先給出代碼,再進(jìn)行講解:
[Flags()]
public enum AspectTypes
{
PreProcess = 1,
ExceptionHandler = 2,
PostProcess = 4
}
/// <summary>
/// 描述切面信息的屬性
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class AspectAttribute : Attribute
{
private AspectTypes _aspectType;
public AspectTypes AspectType
{
get { return _aspectType; }
}
public AspectAttribute(AspectTypes aspectType)
{
_aspectType = aspectType;
}
}
首先是一個枚舉類,用來表示方法要使用的切面類型,使用了Flags屬性標(biāo)識,方便之后進(jìn)行位操作;然后是繼承自Attribute的屬性類,[AttributeUsage(AttributeTargets.Method)]屬性表示這個屬性只能用在方法上,這正是我們需要的效果,關(guān)于屬性的定義和使用大家應(yīng)該并不陌生吧?我就不多說了,接下來在客戶端就可以用如下的方式進(jìn)行使用:
[Aspect(AspectTypes.PreProcess | AspectTypes.ExceptionHandler)]
public virtual void Test1(string num)
這就表示這個Test1方法需要進(jìn)行預(yù)處理和異常處理,而具體的處理信息的定義則放在配置文件中,這部分將在明天講到。最后在反射中可以用如下的方式判斷某個方法是否需要進(jìn)行處理if ((aspectType & AspectTypes.PostProcess) == AspectTypes.PostProcess)(感覺這么寫很繁瑣,由于是第一次對枚舉進(jìn)行位運(yùn)算,也不知道有沒有更簡便的方法,希望知道的能給與指點(diǎn))。好啦,今天就到此為止!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園