我目前正在使用 NHibernate 处理 ASP.NET MVC 项目,我需要跟踪某些实体的更改,以便能够对数据进行一些报告和查询。出于这个原因,我想将数据放在一个表中,但我试图决定在哪里“ Hook ”审计代码。
在NHibernate层:
在 Controller 级别的操作过滤器上:
有什么线索吗?
更新 :查看如何 Create an Audit Log using NHibernate Events 。
最佳答案
我认为在存储库级别执行此操作更合适。主要是因为您将来可能决定添加一些不通过 MVC 访问存储库的方法(例如,数据的 WCF 接口(interface))。
所以问题变成了,你如何解决你在 NHibernate 层上列出的关于这样做的缺点?
过滤掉有用的实体很简单。我可能会通过实体类型的自定义属性来做到这一点。您可以标记要跟踪的实体,也可以标记不需要的实体;哪个更容易。
弄清楚 Controller 的真正意图更难。我要争辩说您可以“获取 HttpContext”;我认为在存储库中执行此操作不是一个好主意,因为关注点分离。存储库不应依赖于网络。一种方法是在存储库上为您想要以不同方式跟踪的操作创建自定义方法;如果这些编辑的其他方面表现不同,例如不同的安全性,这将特别有吸引力。另一种方法是通过比较对象的旧版本和新版本来检查更改并推导出更改的实际性质。第三种方法是不尝试推导出更改的性质,而将之前和之后的版本存储在日志中,以便阅读日志的人可以自己弄清楚。
关于asp.net-mvc - 在哪里放置审计或日志记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/755819/