使用AOP技术拦截ADO.Net

时间:2011-05-03 13:54:20

标签: .net ado.net aop castle dynamic-proxy

我使用各种不同的ADO技术(即一些EF,在某些情况下直接使用ADO.Net)有相当大的代码库。

我想知道是否有任何方法可以全局拦截任何ADO.Net调用,以便我可以开始审核信息,例如执行的确切SQL语句,花费的时间,返回的结果等等。

主要的想法是,如果我能做到这一点,我不应该更改任何现有代码,我应该能够拦截/包装ADO.Net ......这可能吗?

修改

建议我查看PostSharpCciSharpAfterthought,但如何使用其中一项来获得所需的结果?

2 个答案:

答案 0 :(得分:1)

没有。 如果您直接针对ADO.NET类型进行编码,您不能只告诉DynamicProxy:“嘿,在我在所有这些DLL中使用SqlConnection的地方放置代理”。 DynamicProxy是运行时代理生成器。您似乎想要后期编译 AOP,因此请查看PostSharpCciSharpAfterthought

编辑:如果这些工具都不够,你可以使用Mono.Cecil直接改变你的IL,但这并不容易。例如见:

答案 1 :(得分:0)

vdh_ant

  

我想知道是否有任何方法可以全局拦截任何ADO.Net调用,以便我可以开始审核信息,例如执行的确切SQL语句,花费的时间,返回的结果等。

为什么不使用您的 RDBMS 中可用的配置工具?它们更为通用,因为它们将捕获所有 SQL 语句和查询,而与特定的 DB API 无关。此外,它们还提供开箱即用的标准性能分析和统计信息。

另一种选择是编写自己的虚拟 ADO.NET 提供程序,如果需要使用特定于DB的功能,则可以将其封装为System.Data.Common中的类或特定提供程序的包装。该包装程序可以记录必要的信息,并将实际工作委托给基础的本地提供程序。