日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用PostSharp开始AOP

發布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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开始AOP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。