我目前正在使用 NHibernate 处理 ASP.NET MVC 项目,我需要跟踪某些实体的更改,以便能够对数据进行一些报告和查询。出于这个原因,我想将数据放在一个表中,但我试图决定在哪里“ Hook ”审计代码。

在NHibernate层:

  • PRO:强大的事件系统来跟踪任何变化
  • PRO:应用程序中的任何内容都不能更改,恕不另行通知(除非有人使用原始 SQL...)
  • CON:因为我有一个通用存储库...然后我必须过滤掉有用的实体(我不需要跟踪所有内容)。
  • CON:我无法轻松访问 Controller 和操作,因此我只能跟踪基本操作(更新、删除...)。我至少可以获取 HttpContext 以获取一些信息。

  • 在 Controller 级别的操作过滤器上:
  • PRO:关于请求和 Web 应用程序状态的完整信息。通过这种方式,我可以将“编辑”与“状态更改”区分开来,并在审计信息中更具描述性。
  • CON:有人可能会忘记过滤器,并且可以在没有通知的情况下执行重要操作,这是一个大骗局。

  • 有什么线索吗?

    更新 :查看如何 Create an Audit Log using NHibernate Events

    最佳答案

    我认为在存储库级别执行此操作更合适。主要是因为您将来可能决定添加一些不通过 MVC 访问存储库的方法(例如,数据的 WCF 接口(interface))。

    所以问题变成了,你如何解决你在 NHibernate 层上列出的关于这样做的缺点?

    过滤掉有用的实体很简单。我可能会通过实体类型的自定义属性来做到这一点。您可以标记要跟踪的实体,也可以标记不需要的实体;哪个更容易。

    弄清楚 Controller 的真正意图更难。我要争辩说您可以“获取 HttpContext”;我认为在存储库中执行此操作不是一个好主意,因为关注点分离。存储库不应依赖于网络。一种方法是在存储库上为您想要以不同方式跟踪的操作创建自定义方法;如果这些编辑的其他方面表现不同,例如不同的安全性,这将特别有吸引力。另一种方法是通过比较对象的旧版本和新版本来检查更改并推导出更改的实际性质。第三种方法是不尝试推导出更改的性质,而将之前和之后的版本存储在日志中,以便阅读日志的人可以自己弄清楚。

    关于asp.net-mvc - 在哪里放置审计或日志记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/755819/

    10-11 02:46