我正在做一个需要以下内容的项目:
- 从特定的 NHibernate 3.2 会话中提取完整的 SQL 查询。
- 对查询执行特定操作(即不必记录它)
- 不影响整个系统的NHibernate,避免引入性能问题
我检查了几种方法,其中许多已经出现在 StackOverflow 上。这是我现在看到的选项:
手动的
在最幼稚和最烦人的解决方案中,我可以只遵循业务逻辑并自己构建查询 - 例如,如果 BL 构建了一个对 ID=5 进行限制的条件,我将使用SELECT ... WHERE ID = 5
. 由于我们有一个相当复杂的 BL,我真的很想避免这种情况。
NHibernate 拦截
最初,使用OnPrepareStatement
似乎是最好的选择。但是,我很快发现查询的参数没有被记录,这使得它变得毫无用处。
内省 NHibernarnate 的 ICriteria
当使用 NHibernate 执行查询时,我们使用包含限制、排序和聚合定义的 ICreteria 对象来执行此操作。似乎我可以在此处描述的 CriteriaWalker 时对其进行检查。但是,它似乎对复杂的查询感到困惑。此外,在某些情况下,我们使用 NHibernate 3 新的“QueryOver”语法,这个解决方案对我没有帮助。
使用 ILoggerFactory
从 NHibernate 3 开始,您可以编写自定义日志工厂(示例)。这得到了完整的 SQL,但是,它也影响了整个 NHibernate 系统,似乎不可能有工厂来申请特定的 ISession,甚至是 ISessionFactory。
自定义 NHibernate 驱动程序
我考虑过编写代理 NHibernate 驱动程序并将其分配给特定的 SessionFactory(如此处所述)。但是,友好的评论警告说它在 Nhibernate 3.2 中的工作时间更长。
使用动态代理
此代码使用 Castle 的动态代理将自身注入到 ISession 中。我还没有尝试在我的服务器上运行它,但我对使用这种激烈的措施有点警惕。但是,如果没有其他方法可行,我想这是需要考虑的事情。
建议?
现在我有点坚持选择最好的方式,因为似乎没有什么在做它的工作,完全正确。如果还有其他建议,我很想听听。