我有相当大的代码库使用各种不同的ADO技术(即一些EF,在某些情况下直接使用ADO.Net)。
我想知道是否有任何方法可以全局拦截任何ADO.Net调用,以便我可以开始审核信息 - 执行的确切SQL语句,花费的时间,返回的结果等等。
主要的想法是,如果我能做到这一点,我不应该更改任何现有代码,并且我应该能够拦截/包装ADO.Net调用......这可能吗?< / p>
答案 0 :(得分:1)
您可以全局拦截您有权访问的任何方法(即:您生成的模型和上下文)。如果你需要拦截框架BCL中的方法,那么没有。
如果您只想获取从EF模型生成的SQL,则使用OnMethodBoundaryAspect拦截其中一个所需方法,您可以使用OnEntry和OnExit方法进行日志记录。
请记住,您只能拦截您有权访问的代码。生成的EF代码是可访问的,但会覆盖您对其所做的任何更改,因此您需要使用部分类或使用程序集声明来应用方面。我建议后者,因为你想要全局拦截。
只需2美分:您可能希望查看其他替代方案,例如SQL分析器或重新设计您的体系结构。
答案 1 :(得分:1)
Afterthought是一个开源工具,支持修改现有的dll,而无需从源代码重新编译以添加方面属性。为此,您需要在单独的dll中创建修改(在Afterthought中描述更改的方式),并且此dll需要具有实现IAmendmentAttribute的程序集级属性,该属性将标识目标程序集中的类型过程
请查看logging example以查看其工作原理,如果您有任何问题,请与我们联系。
请注意,Afterthought修改目标程序集以调用另一个程序集(您的工具)中的静态方法。如果你想通过任何方式修改目标程序集来拦截调用,那么我建议查看.NET分析API。
杰米·托马斯(Afterthought的主要作者)