【问题标题】:Using AOP techniques to intercept ADO.Net使用 AOP 技术拦截 ADO.Net
【发布时间】:2011-05-03 13:54:20
【问题描述】:

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

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

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

编辑

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

【问题讨论】:

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


【解决方案1】:

没有。 如果您直接针对 ADO.NET 类型进行编码,您不能只告诉 DynamicProxy:“嘿,在所有这些 DLL 中使用 SqlConnection 的任何地方都放置一个代理”。 DynamicProxy 是一个runtime 代理生成器。您似乎需要编译后 AOP,所以请改用PostSharpCciSharpAfterthought

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

【讨论】:

  • 那么 PostSharp、CciSharp 或 Afterthought 能够做到这一点吗?即,即使代码显示“new SqlComment()”,我也可以代理...
  • @vdh_ant:他们通过重写 IL 来工作,所以原则上他们几乎可以做任何事情。
  • 好的,回到手头的问题,我将如何使用其中任何一种来做我需要的事情?即把 SqlCommand 包装起来,这样我就可以得到我需要的信息......
  • @vdh_ant:这是另一个问题。我会针对每个工具发布一个问题,然后使用答案进行比较。
【解决方案2】:

vdh_ant

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

为什么不使用您的RDBMS 中提供的分析工具呢?它们更通用,因为它们将捕获所有 SQL 语句和查询,而不管特定的 DB API。此外,它们提供开箱即用的标准性能分析和统计数据。

另一种选择是编写您自己的虚拟 ADO.NET 提供程序,如果您需要特定于 DB 的功能,可以作为 System.Data.Common 的类的包装器或您的特定提供程序的包装器。该包装器可以记录必要的信息并将实际工作委托给底层的原生提供者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多