日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(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

總結(jié)

以上是生活随笔為你收集整理的使用PostSharp开始AOP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。