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/

    相关文章:

    asp.net-mvc - ASP.NET Web Api OData : How to validate Delta<Entity>?

    c# - 使用 HQL 查询从所有表而不是一个表中获取数据应该只获取 1 个表的数据

    c# - 如何检查键是否是 NHibernate 中未保存的值

    java - 每次调用 logger.info/debug/warn() 调用时,只用 log4j 记录一次

    c# - 是什么导致我的 ASP.NET MVC/AJAX 网站上出现这些 SQL 转换错误? [视频显示问题]

    asp.net-mvc - ASP.Net MVC - View 中的空对象

    node.js - 如何在 node.js 和 mongoDB native 驱动程序上启用调试?

    logging - Matplotlib - 当我切换到半对数图时数据消失

    c# - MVC4 添加 header 到重定向响应不起作用

    c# - Quartz.net + NHibernate + Windsor.CaSTLe + CommonServiceLocator