PostSharp是基于.NET平台設計的比較強調易學易用的AOP架構,AOP的概念,優點請參見:
http://www.cnblogs.com/wayfarer/category/35983.html
這裡隻是簡要的介紹幾種使用PostSharp實作的場景供大家參考。
一、日志
一般我們寫入業務方面的日志有兩種方式,
1、簡單的記錄業務方法的發生時間,觸發使用者,業務方法名等
傳統方案我們是這樣記錄的。
<a></a>
public class Employee
{
public void Add(string employeeName, string employeePwd)
{
Console.WriteLine("添加員工名:{0},密碼:{1}",employeeName,employeePwd);
LogManager.LogWrite("Add");
}
}
class LogManager
{
public static void LogWrite(string methodName)
GenericPrincipal gp = (GenericPrincipal)Thread.GetData(
Thread.GetNamedDataSlot("Principal"));
Console.WriteLine("使用者名:{0},日志時間:{1},觸發此日志的方法:{2}",
gp.Identity.Name, DateTime.Now.ToString(), methodName);
}
//主程式:
static void Main(string[] args)
GenericIdentity gi = new GenericIdentity("lfm");
GenericPrincipal gp = new GenericPrincipal(gi, new string[] { "Admin" });
LocalDataStoreSlot localSlot = Thread.AllocateNamedDataSlot("Principal");
Thread.SetData(localSlot, gp);
Employee em = new Employee();
em.Add("lfm","lfm");
(因為這裡使用的控制台應用程式,為了便于測試我們使用了線程槽來存儲使用者,如果不了解這個部分可以暫時忽略使用者資訊。)傳統方案的日志記錄的問題是每個需要記錄日志的方法都要依賴于LogManager類,也就是說所有的業務邏輯都要依賴于系統級的LogManager類,我們能不能讓他們徹底的分離開呢,下面我們使用PostSharp提供的方式來解決這個問題。
使用postSharp記錄日志
[Serializable]
class SampleLogAttribute : OnMethodBoundaryAspect
public override void OnSuccess(MethodExecutionEventArgs eventArgs)
LogManager.LogWrite(eventArgs);
日志記錄類:
public static void LogWrite(MethodExecutionEventArgs eventArgs)
gp.Identity.Name, DateTime.Now.ToString(),
eventArgs.Instance.ToString() + "." + eventArgs.Method.Name);
然後在需要記錄日志的方法上辨別SampleLogAttribute即可
相應方法
[SampleLog]
public void Add(string employeeID, string pwd)
Console.WriteLine("使用者名:{0}密碼:{1}", employeeID, pwd);
這時我們運作程式會得到如下結果:
這裡我們需要去了解一下OnMethodBoundaryAspect類,我們可以通過重寫OnEntry,OnSuccess兩個方法來截獲方法的資訊,OnEntry是在辨別了相應特性的方法前觸發,而OnSuccess是在辨別了相應特性的方法後觸發。
2、我們可能需要記錄方法的一些更詳細的資訊,比如說更新操作,我們需要記錄更新前的資訊
日志的記錄特性代碼如下:
複雜日志記錄
class UpdateLogAttribute : OnMethodBoundaryAspect
public override void OnEntry(MethodExecutionEventArgs eventArgs)
LogManager.LogWrite(eventArgs);
foreach (var item in eventArgs.Instance.GetType().GetProperties())
{
Console.WriteLine("原屬性名:{0},原值:{1}",item.Name,
item.GetValue(eventArgs.Instance,null));
}
Console.WriteLine();
//業務類:
class Employee
public Employee(string employeeID, string pwd)
this.EmployeeID = employeeID;
this.Pwd = pwd;
[UpdateLog]
public void Update(Employee em)
this.EmployeeID = em.EmployeeID;
this.Pwd = em.Pwd;
Console.WriteLine("更新後:employeeID:{0},pwd:{1}",this.EmployeeID,this.Pwd);
public string EmployeeID { get; set; }
public string Pwd { get; set; }
運作主程式結果如下:
也許還有些情況日志記錄會更複雜,但一般情況下我們都可以通過截獲方法的參數,執行個體的屬性等獲得想要的資訊。可能你會覺得這樣一個一個寫特性也挺麻煩,PostSharp提供了一種廣播橫切點的方式,我們可以在類上使用相關的特性然後設定其AttributeTargetMembers值,如:
[SampleLog(AttributeTargetMembers = "Add*")]
class Employee
這樣Employee類中所有使用Add開頭的方法都将記錄日志,也可以設定整個程式集,大家可以參考PostSharp提供的文檔。
<a href="http://files.cnblogs.com/nuaalfm/LogAop.rar">源碼下載下傳</a>
本文轉自 你聽海是不是在笑 部落格園部落格,原文連結: http://www.cnblogs.com/nuaalfm/archive/2009/02/23/1396415.html,如需轉載請自行聯系原作者