我使用各种不同的ADO技术(即一些EF,在某些情况下直接使用ADO.Net)有相当大的代码库。
我想知道是否有任何方法可以全局拦截任何ADO.Net调用,以便我可以开始审核信息,例如执行的确切SQL语句,花费的时间,返回的结果等等。
主要的想法是,如果我能做到这一点,我不应该更改任何现有代码,我应该能够拦截/包装ADO.Net ......这可能吗?
修改
建议我查看PostSharp,CciSharp或Afterthought,但如何使用其中一项来获得所需的结果?
答案 0 :(得分:1)
没有。 如果您直接针对ADO.NET类型进行编码,您不能只告诉DynamicProxy:“嘿,在我在所有这些DLL中使用SqlConnection的地方放置代理”。 DynamicProxy是运行时代理生成器。您似乎想要后期编译 AOP,因此请查看PostSharp,CciSharp或Afterthought。
编辑:如果这些工具都不够,你可以使用Mono.Cecil直接改变你的IL,但这并不容易。例如见:
答案 1 :(得分:0)
vdh_ant :
我想知道是否有任何方法可以全局拦截任何ADO.Net调用,以便我可以开始审核信息,例如执行的确切SQL语句,花费的时间,返回的结果等。
为什么不使用您的 RDBMS 中可用的配置工具?它们更为通用,因为它们将捕获所有 SQL 语句和查询,而与特定的 DB API 无关。此外,它们还提供开箱即用的标准性能分析和统计信息。
另一种选择是编写自己的虚拟 ADO.NET 提供程序,如果需要使用特定于DB的功能,则可以将其封装为System.Data.Common
中的类或特定提供程序的包装。该包装程序可以记录必要的信息,并将实际工作委托给基础的本地提供程序。