2011-05-04 47 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。

杰米托马斯(后添的主要作者)