當(dāng)前位置:
首頁(yè) >
使用PostSharp开始AOP
發(fā)布時(shí)間:2025/7/14
37
豆豆
生活随笔
收集整理的這篇文章主要介紹了
使用PostSharp开始AOP
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
近段時(shí)間有時(shí)間看看以前寫(xiě)的代碼,系統(tǒng)有一個(gè)功能:用戶的任意一個(gè)修改,刪除操作都要進(jìn)行日志記錄,當(dāng)時(shí)進(jìn)度太趕,也只是知道 aop(關(guān)于什么是 aop 請(qǐng)自行g(shù)oogle) 能處理這方面的問(wèn)題,具體的還沒(méi)接觸 :( . --- 當(dāng)時(shí)我的處理方式是將日志寫(xiě)為一個(gè)靜態(tài)方法,然后在每個(gè)操作完成后加上: Log.write(用戶ID, "操作信息") ;隨著系統(tǒng)的增大,新的功能新的成員不斷地加入, 問(wèn)題就出現(xiàn)了.每個(gè)成員都會(huì)問(wèn):這個(gè)日志該怎么記錄(雖然有文檔,可總是感覺(jué)不太方便)?
近幾天接觸 PostSharp, 看看別人寫(xiě)的挺簡(jiǎn)單的,遂決定試一下(先前看過(guò) Castle ,可它的動(dòng)態(tài)代理好像只能在 virtual 方法上,不知道是我理解錯(cuò)了還是..否則就是 要用上 ioc....放棄).
就我所理解的,選用 PostSharp 的好處有:
1.采用 MSIL 靜態(tài)代碼注入,避免使用反射;
2.使用 MSBuild Task,使得開(kāi)發(fā)人員可以像使用編譯器內(nèi)置 Attribute 那樣使用 AOP;
3.可以攔截任意方法而不是局限于 virtual 方法;
4.對(duì)調(diào)用方法有更多的控制方法,比如輸入?yún)?shù),返回結(jié)果等
話會(huì)正題.開(kāi)始前先到官網(wǎng)下載一個(gè)版本的 PostSharp(www.postsharp.org). 現(xiàn)在已經(jīng)出了2.0 了,不過(guò)是45天的試用期,(過(guò)期收費(fèi)?).裝上試一下,它會(huì)在 vs2008 上面安插一個(gè)插件(這個(gè)暫不理會(huì)).真正到項(xiàng)目中使用的還是免費(fèi)的好(我自己怎么為公司掏?),還是下個(gè) 1.5 的吧,關(guān)閉 vs 后安裝.
新建一個(gè) console 項(xiàng)目. 先模擬實(shí)現(xiàn) Log:
日志模擬記錄 ????public?static?class?Log
????{
????????public?static?void?Write(MethodExecutionEventArgs?eventArgs,string?message)
????????{
????????????Console.WriteLine("開(kāi)始日志記錄.方法名:?{0}?,?實(shí)例名:?{1}.?附帶信息:{2}",
????????????????eventArgs.Method.Name,?eventArgs.Instance?,?message?);
????????}
????}
引用postsharp相關(guān)dll后(1.5: postsharp.laos ,postsharp.public? .2.0 就 postsharp ) 再實(shí)現(xiàn)某個(gè)類型的 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);
????????}
????}
準(zhǔn)備就緒后使用:
如何調(diào)用: ????class?Start
????{
????????static?void?Main()?{
????????????Speak("我開(kāi)始哈");
????????????EndSpeak();
????????????Console.ReadKey();
????????}
????????[Posts("開(kāi)始說(shuō)話了..")]
????????private?static?void?Speak(string?message)?{
????????????Console.WriteLine(".{0}.....正式執(zhí)行了....",?message);
????????}
????????[Posts("error:")]
????????[onException("endspeak")]
????????static?void?EndSpeak()?{
????????????Console.WriteLine("會(huì)發(fā)生錯(cuò)誤的調(diào)用......");
????????????throw?new?Exception("======?這是故意發(fā)生的錯(cuò)誤.===");
????????}
????}
運(yùn)行結(jié)果:
完整的 test 見(jiàn)源文件: 下載
安裝文件下載:/Files/infozero/PostSharp安裝文件.rar
近幾天接觸 PostSharp, 看看別人寫(xiě)的挺簡(jiǎn)單的,遂決定試一下(先前看過(guò) Castle ,可它的動(dòng)態(tài)代理好像只能在 virtual 方法上,不知道是我理解錯(cuò)了還是..否則就是 要用上 ioc....放棄).
就我所理解的,選用 PostSharp 的好處有:
1.采用 MSIL 靜態(tài)代碼注入,避免使用反射;
2.使用 MSBuild Task,使得開(kāi)發(fā)人員可以像使用編譯器內(nèi)置 Attribute 那樣使用 AOP;
3.可以攔截任意方法而不是局限于 virtual 方法;
4.對(duì)調(diào)用方法有更多的控制方法,比如輸入?yún)?shù),返回結(jié)果等
話會(huì)正題.開(kāi)始前先到官網(wǎng)下載一個(gè)版本的 PostSharp(www.postsharp.org). 現(xiàn)在已經(jīng)出了2.0 了,不過(guò)是45天的試用期,(過(guò)期收費(fèi)?).裝上試一下,它會(huì)在 vs2008 上面安插一個(gè)插件(這個(gè)暫不理會(huì)).真正到項(xiàng)目中使用的還是免費(fèi)的好(我自己怎么為公司掏?),還是下個(gè) 1.5 的吧,關(guān)閉 vs 后安裝.
新建一個(gè) console 項(xiàng)目. 先模擬實(shí)現(xiàn) Log:
日志模擬記錄 ????public?static?class?Log
????{
????????public?static?void?Write(MethodExecutionEventArgs?eventArgs,string?message)
????????{
????????????Console.WriteLine("開(kāi)始日志記錄.方法名:?{0}?,?實(shí)例名:?{1}.?附帶信息:{2}",
????????????????eventArgs.Method.Name,?eventArgs.Instance?,?message?);
????????}
????}
引用postsharp相關(guān)dll后(1.5: postsharp.laos ,postsharp.public? .2.0 就 postsharp ) 再實(shí)現(xiàn)某個(gè)類型的 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);
????????}
????}
準(zhǔn)備就緒后使用:
如何調(diào)用: ????class?Start
????{
????????static?void?Main()?{
????????????Speak("我開(kāi)始哈");
????????????EndSpeak();
????????????Console.ReadKey();
????????}
????????[Posts("開(kāi)始說(shuō)話了..")]
????????private?static?void?Speak(string?message)?{
????????????Console.WriteLine(".{0}.....正式執(zhí)行了....",?message);
????????}
????????[Posts("error:")]
????????[onException("endspeak")]
????????static?void?EndSpeak()?{
????????????Console.WriteLine("會(huì)發(fā)生錯(cuò)誤的調(diào)用......");
????????????throw?new?Exception("======?這是故意發(fā)生的錯(cuò)誤.===");
????????}
????}
運(yùn)行結(jié)果:
完整的 test 見(jiàn)源文件: 下載
安裝文件下載:/Files/infozero/PostSharp安裝文件.rar
總結(jié)
以上是生活随笔為你收集整理的使用PostSharp开始AOP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu安装Java开发环境
- 下一篇: 好好学习网--2009年十大新兴企业技术