我正在开展一个需要以下项目的项目:
我检查了几种方法,其中许多方法已经出现在StackOverflow上。以下是我现在看到的选项:
手册
在最天真和最烦人的解决方案中,我可以遵循业务逻辑并自己构建查询 - 例如,如果BL构建了对ID = 5进行限制的条件,我将使用{{构建查询1}}。由于我们有相当复杂的BL,我真的很想避免这种情况。
NHibernate拦截
最初,使用SELECT ... WHERE ID = 5
似乎是最好的选择。但是,我很快discovered不会记录查询的参数,这会使它变得毫无用处。
反思NHibernarnate的ICriteria
使用NHibernate执行查询时,我们使用包含限制,排序和聚合定义的ICreteria对象来完成。在描述here的CriteriaWalker时,我似乎可以看到它。但是,它似乎在复杂的查询上混淆了。此外,在某些情况下,我们使用NHibernate 3新的“QueryOver”语法,此解决方案对我没有帮助。
使用ILoggerFactory
从NHibernate 3开始,您可以编写自定义日志工厂(sample)。这会获得完整的SQL,但是,它也影响整个NHibernate系统,它seems it is impossible有一个工厂申请特定的ISession,甚至是ISessionFactory。
自定义NHibernate驱动程序
我考虑编写代理NHibernate驱动程序并将其分配给特定的SessionFactory(如here所述)。然而,一个友好的评论警告说,它在Nhibernate 3.2中更长时间。
使用动态代理
This code使用Castle的动态代理将自己注入到ISession中。我还没有尝试用我的服务器运行它,但我有点担心使用这些激烈的措施。但是,如果没有别的办法,我想这是值得考虑的事情。
建议吗
现在我有点坚持选择最好的方式,因为似乎没有任何工作,非常正确。如果还有其他建议,我很乐意听到。
答案 0 :(得分:2)
我使用标准或自定义日志记录框架,并应用自定义过滤器从线程数据中检索标志(例如),以确定是否应记录会话。
这样,你根本不会混淆NH内部,只要你没有设置标志,就不会记录任何内容。