使用PostSharp开始AOP
生活随笔
收集整理的這篇文章主要介紹了
使用PostSharp开始AOP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
近段時間有時間看看以前寫的代碼,系統有一個功能:用戶的任意一個修改,刪除操作都要進行日志記錄,當時進度太趕,也只是知道 aop(關于什么是 aop 請自行google) 能處理這方面的問題,具體的還沒接觸 :( . --- 當時我的處理方式是將日志寫為一個靜態方法,然后在每個操作完成后加上: Log.write(用戶ID, "操作信息") ;隨著系統的增大,新的功能新的成員不斷地加入, 問題就出現了.每個成員都會問:這個日志該怎么記錄(雖然有文檔,可總是感覺不太方便)?
近幾天接觸 PostSharp, 看看別人寫的挺簡單的,遂決定試一下(先前看過 Castle ,可它的動態代理好像只能在 virtual 方法上,不知道是我理解錯了還是..否則就是 要用上 ioc....放棄).
就我所理解的,選用 PostSharp 的好處有:
1.采用 MSIL 靜態代碼注入,避免使用反射;
2.使用 MSBuild Task,使得開發人員可以像使用編譯器內置 Attribute 那樣使用 AOP;
3.可以攔截任意方法而不是局限于 virtual 方法;
4.對調用方法有更多的控制方法,比如輸入參數,返回結果等
話會正題.開始前先到官網下載一個版本的 PostSharp(www.postsharp.org). 現在已經出了2.0 了,不過是45天的試用期,(過期收費?).裝上試一下,它會在 vs2008 上面安插一個插件(這個暫不理會).真正到項目中使用的還是免費的好(我自己怎么為公司掏?),還是下個 1.5 的吧,關閉 vs 后安裝.
新建一個 console 項目. 先模擬實現 Log:
日志模擬記錄 ????public?static?class?Log
????{
????????public?static?void?Write(MethodExecutionEventArgs?eventArgs,string?message)
????????{
????????????Console.WriteLine("開始日志記錄.方法名:?{0}?,?實例名:?{1}.?附帶信息:{2}",
????????????????eventArgs.Method.Name,?eventArgs.Instance?,?message?);
????????}
????}
引用postsharp相關dll后(1.5: postsharp.laos ,postsharp.public? .2.0 就 postsharp ) 再實現某個類型的 attribute : 繼承自 AttributeTargets (1.5 的namespace 是 PostSharp.public ,2.0 好像 PostSharp.Aspects )
注意:1.5和 2.0 方法簽名不一樣 ????[Serializable]
????[global::System.AttributeUsage(AttributeTargets.All,?AllowMultiple=true)]
????public?class?PostsAttribute??:?OnMethodBoundaryAspect
????{
????????/*?PostSharp?2.0?里可用的方法
????????public?override?void?OnSuccess(MethodExecutionArgs?args)
????????{
????????????Console.WriteLine("...{0}...onsuccess......",?DateTime.Now);
????????????base.OnSuccess(args);
????????????Log.Write(args);
????????}
????????*/
????????private?string?_msg?=?string.Empty;
????????public?PostsAttribute(string?message)?{
????????????_msg?=?message;
????????}
????????public?override?void?OnEntry(MethodExecutionEventArgs?args)
????????{
????????????Console.WriteLine("...{0}...onEntry......",?DateTime.Now);
????????????base.OnEntry(args);
????????}
????????public?override?void?OnExit(MethodExecutionEventArgs?args)
????????{
????????????Console.WriteLine("...{0}...OnExit......"?,?DateTime.Now);
????????????base.OnExit(args);
????????}
????}
準備就緒后使用:
如何調用: ????class?Start
????{
????????static?void?Main()?{
????????????Speak("我開始哈");
????????????EndSpeak();
????????????Console.ReadKey();
????????}
????????[Posts("開始說話了..")]
????????private?static?void?Speak(string?message)?{
????????????Console.WriteLine(".{0}.....正式執行了....",?message);
????????}
????????[Posts("error:")]
????????[onException("endspeak")]
????????static?void?EndSpeak()?{
????????????Console.WriteLine("會發生錯誤的調用......");
????????????throw?new?Exception("======?這是故意發生的錯誤.===");
????????}
????}
運行結果:
完整的 test 見源文件: 下載
安裝文件下載:/Files/infozero/PostSharp安裝文件.rar
近幾天接觸 PostSharp, 看看別人寫的挺簡單的,遂決定試一下(先前看過 Castle ,可它的動態代理好像只能在 virtual 方法上,不知道是我理解錯了還是..否則就是 要用上 ioc....放棄).
就我所理解的,選用 PostSharp 的好處有:
1.采用 MSIL 靜態代碼注入,避免使用反射;
2.使用 MSBuild Task,使得開發人員可以像使用編譯器內置 Attribute 那樣使用 AOP;
3.可以攔截任意方法而不是局限于 virtual 方法;
4.對調用方法有更多的控制方法,比如輸入參數,返回結果等
話會正題.開始前先到官網下載一個版本的 PostSharp(www.postsharp.org). 現在已經出了2.0 了,不過是45天的試用期,(過期收費?).裝上試一下,它會在 vs2008 上面安插一個插件(這個暫不理會).真正到項目中使用的還是免費的好(我自己怎么為公司掏?),還是下個 1.5 的吧,關閉 vs 后安裝.
新建一個 console 項目. 先模擬實現 Log:
日志模擬記錄 ????public?static?class?Log
????{
????????public?static?void?Write(MethodExecutionEventArgs?eventArgs,string?message)
????????{
????????????Console.WriteLine("開始日志記錄.方法名:?{0}?,?實例名:?{1}.?附帶信息:{2}",
????????????????eventArgs.Method.Name,?eventArgs.Instance?,?message?);
????????}
????}
引用postsharp相關dll后(1.5: postsharp.laos ,postsharp.public? .2.0 就 postsharp ) 再實現某個類型的 attribute : 繼承自 AttributeTargets (1.5 的namespace 是 PostSharp.public ,2.0 好像 PostSharp.Aspects )
注意:1.5和 2.0 方法簽名不一樣 ????[Serializable]
????[global::System.AttributeUsage(AttributeTargets.All,?AllowMultiple=true)]
????public?class?PostsAttribute??:?OnMethodBoundaryAspect
????{
????????/*?PostSharp?2.0?里可用的方法
????????public?override?void?OnSuccess(MethodExecutionArgs?args)
????????{
????????????Console.WriteLine("...{0}...onsuccess......",?DateTime.Now);
????????????base.OnSuccess(args);
????????????Log.Write(args);
????????}
????????*/
????????private?string?_msg?=?string.Empty;
????????public?PostsAttribute(string?message)?{
????????????_msg?=?message;
????????}
????????public?override?void?OnEntry(MethodExecutionEventArgs?args)
????????{
????????????Console.WriteLine("...{0}...onEntry......",?DateTime.Now);
????????????base.OnEntry(args);
????????}
????????public?override?void?OnExit(MethodExecutionEventArgs?args)
????????{
????????????Console.WriteLine("...{0}...OnExit......"?,?DateTime.Now);
????????????base.OnExit(args);
????????}
????}
準備就緒后使用:
如何調用: ????class?Start
????{
????????static?void?Main()?{
????????????Speak("我開始哈");
????????????EndSpeak();
????????????Console.ReadKey();
????????}
????????[Posts("開始說話了..")]
????????private?static?void?Speak(string?message)?{
????????????Console.WriteLine(".{0}.....正式執行了....",?message);
????????}
????????[Posts("error:")]
????????[onException("endspeak")]
????????static?void?EndSpeak()?{
????????????Console.WriteLine("會發生錯誤的調用......");
????????????throw?new?Exception("======?這是故意發生的錯誤.===");
????????}
????}
運行結果:
完整的 test 見源文件: 下載
安裝文件下載:/Files/infozero/PostSharp安裝文件.rar
總結
以上是生活随笔為你收集整理的使用PostSharp开始AOP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu安装Java开发环境
- 下一篇: 好好学习网--2009年十大新兴企业技术