asp.net-mvc - 在哪里放置审计或日志记录?

标签 asp.net-mvc nhibernate logging

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

在 NHibernate 层上:

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

  • 在 Controller 级别的 Action 过滤器上:
  • 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/

    相关文章:

    jquery - ASP.NET MVC 和 JQuery 对话框回发

    jquery - 对于非浏览器区域设置日期格式,L18N 日期的客户端验证始终失败

    NHibernate 集合和移动对象

    c# - Nhibernate 使用 Fluent 禁用二级缓存 - 也禁用假缓存

    python - 自定义 Flask 应用程序的记录器名称

    go - 如何详细打印结构并隐藏一些字段?

    c# - 带有查询字符串的 RouteUrl - 带有重复键

    javascript - Cookie 为空,但在浏览器中有一个值

    c# - NHibernate,日志查询执行时间?

    python - Django如何关闭警告