說到AOP在VEVb上也有不少關于實現的文章,所以這次就不描述具體實現;有興趣可以下載組件源碼了解,當然組件只是一個初型并不會有什么強大的功能,也可能存在比較多的問題。
這幾天由于項目移交給測試人員測試,因此空閑的時間比較多;為了不浪費這些時間所以想到用Remoting透明代理機制做一個簡單的AOP組件,順便也學習Remoting中透明代理的實現和運用。剛開始做還是挺痛頭的,因為本機的MSDN并沒有充足的幫助。于是就到VEVb和Google搜了一下,找到一編不錯的文章:http://www.rsdn.ru/article/dotnet/cntxtvsrealPRoxy.xml。把資料整理和清楚一下思路就開始干活。實現過程大概花了一個工作日吧,主要實現了以下對象:
AopProxyAttribute派生于ProxyAttribute
AopRealProxyy派生于RealProxy
/// <summary>
/// 攔載對象描述接口
/// </summary>
public interface ICutiner
{
/// <summary>
/// 執行方法的源對象
/// </summary>
object Source
{
get;
}
/// <summary>
/// 執行方法的參數集
/// </summary>
object[] Args
{
get;
}
/// <summary>
/// 方法執行前攔載過程
/// </summary>
void Executing();
/// <summary>
/// 方法執行后攔載過程
/// </summary>
/// <param name="returnvalue">返回值</param>
/// <returns>處理后的返回</returns>
object Executed(object returnvalue);
/// <summary>
/// 實始化攔載對象
/// </summary>
/// <param name="source"></param>
/// <param name="args"></param>
void initialize(object source,object[] args);
/// <summary>
/// 執行方法錯誤信息
/// </summary>
Exception Error
{
get;
set;
}
}
制定規則后剩下的工作就整合了,如何把功能整合起來就不說了,對開發人員來說源碼是最好的文檔。
下面讓我們來看下組件在實際使用中的效果。
值驗證
[AopLibrary.AopProxy]
public class Product:ContextBoundObject
{
public Product()
{
//
//
}
private string mName;
public string Name
{
get
{
return mName;
}
set
{
mName = value;
}
}
public void Save()
{
}
}
如何通過AOP的方式在調用Product對象的Save方法前進行檢查Name值是否合法。可以通過以下方式實現橫向檢測對象:
public class ValTest:AopLibrary.CutinerAdapter
{
public override void Executing()
{
Product pr = (Product)Source;
if(pr.Name == null || pr.Name =="")
{
throw(new Exception("請輸入合法的產品名稱!"));
}
base.Executing ();
}
}
當制定檢測對象后,就可以通過配置文件關聯起來。
<accepter type="AopTest.validate.Product,AopTest">
<cutiner method="Save" type="AopTest.validate.ValTest,AopTest" />
</accepter>
測試調用代碼:
try
{
validate.Product product = new AopTest.validate.Product();
product.Name ="cat";
product.Save();
Console.WriteLine("Save:OK");
product = new AopTest.validate.Product();
product.Save();
}
catch(Exception e_)
{
Console.WriteLine("Exception:"+e_.Message);
}
統一錯誤處理
AopLibrary.AopProxy]
public class DataParse:ContextBoundObject
{
public DataParse()
{
}
public int ParseInt(string value)
{
return int.Parse(value);
}
public DateTime ParseDT(string value)
{
return DateTime.Parse(value);
}
}
通過AOP的方式統一捕獲ParseInt和ParseDT方法異常并把錯誤信息保存起來。首先是編寫錯誤處理的類:
public class SaveException:AopLibrary.CutinerAdapter
{
public override object Executed(object returnvalue)
{
if(Error != null)
{
System.IO.StreamWriter writer = new System.IO.StreamWriter("c://errorlog.txt",true,System.Text.Encoding.Default);
writer.WriteLine(Error.Message);
writer.Close();
}
return base.Executed (returnvalue);
}
}
有了處理對象后就通過配置關聯起來.
<accepter type="AopTest.exception.DataParse,AopTest">
<cutiner method="ParseDT,ParseInt" type="AopTest.exception.SaveException,AopTest" />
</accepter>
配置完成后當運行ParseInt和ParseDT方法時發生錯誤就會把錯誤信息寫到文件中。
http://henryfan.VEVb.com/archive/2006/06/15/426344.html
新聞熱點
疑難解答