2011-05-04 114 views
1

我有相當使用各種不同的技術ADO(即一些EF和在直接使用ADO.Net某些情況下)一個大的代碼庫。使用PostSharp攔截ADO.Net

我不知道是否有任何方式在全球範圍內攔截任何ADO.Net調用,這樣我就可以開始審覈信息 - 即執行,所花費的時間確切的SQL語句,返回結果等

主要思路如果我可以這樣做,我不應該改變任何現有的代碼,並且我應該能夠攔截/包裝ADO.Net調用...這可能嗎?

+0

似乎是一個冗餘問題。 [PostSharp](http://stackoverflow.com/questions/5885886/using-postsharp-to-intercept-ado-net),[AOP](http://stackoverflow.com/questions/5870539/using-aop-techniques -to-intercept-ado-net),[CciSharp](http://stackoverflow.com/questions/5885904/using-ccisharp-to-intercept-ado-net),[EF](http://stackoverflow.com/questions/5885929/using-afterthought-to-intercept-ado-net) - **相反,只要提出一個問題並涵蓋所有方面。** – 2011-05-07 22:17:44

+0

@rockinthesixstring我不同意。這樣每個問題都更具體/有針對性,OP可以進行比較。 OP甚至可以使用回答計數,問題觀點,投票等作爲分享的指標。 – 2011-05-12 22:53:32

回答

1

您可以全局攔截,你可以訪問任何方法(即:你生成的模型&上下文)。如果你需要攔截BCL框架中的方法,那麼不需要。

如果您只想從EF模型中獲取生成的SQL,可以使用OnMethodBoundaryAspect攔截所需方法之一,然後在OnEntry和OnExit方法中執行日誌記錄。

請記住,您只能攔截您有權訪問的代碼。生成的EF代碼是可訪問的,但會覆蓋您對其所做的任何更改,因此您需要使用部分類或程序集聲明來應用該方面。因爲你想要全球攔截,所以我會建議後者。

只是我的2美分:你可能想看看其他的選擇這個如SQL事件探查器或重新設計架構。

+0

我正在研究存在於單獨的dll中但是正在運行的應用程序的一部分的工具。因此,我需要在另一個dll中「攔截」ADO代碼並記錄它。 – 2011-05-04 16:30:01

+0

@vdh_ant這很好,如果你有權訪問該其他DLL並可以重新編譯它,否則你最好攔截方法調用的DLL中的代碼。有些項目允許您重寫現有DLL的MSIL,但在這種情況下您正在玩火。 – 2011-05-04 19:52:42

1

Afterthought是一個開源工具,它支持修改現有DLL而無需從源重新編譯以添加方面的屬性。爲此,您需要在單獨的dll中創建修改(您在Afterthought中描述更改的方式),並且此dll需要具有實現IAmendmentAttribute的程序集級屬性,該屬性將標識目標程序集中的類型爲處理。

看看在logging example,看看它是如何工作,讓我知道,如果您有任何疑問/問題。

請注意,有感修改你的目標集才能到另一個組件(您的工具)的靜態方法的調用。如果你想通過任何方式修改目標程序集來攔截調用,那麼我建議查看.NET概要分析API。

傑米托馬斯(後添的主要作者)