代码之家  ›  专栏  ›  技术社区  ›  Marc Climent

在哪里进行审计或日志记录?

  •  4
  • Marc Climent  · 技术社区  · 15 年前

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

    在NHiberinate层上:

    • pro:强大的事件系统,可跟踪任何变化
    • pro:应用程序中的任何内容都不能在未经通知的情况下更改(除非有人使用原始SQL…)
    • 康:因为我有一个通用的存储库…然后我必须过滤掉有用的实体(我不需要跟踪所有的东西)。
    • 反对:我不容易访问控制器和操作,所以我只能跟踪基本操作(更新,删除…)。我至少可以通过httpcontext获取一些信息。

    在控制器级别的操作过滤器上:

    • pro:有关请求和Web应用程序状态的完整信息。通过这种方式,我可以区分“编辑”和“状态更改”,并在审计信息中更具描述性。
    • 反对:有人可以忘记一个过滤器,而一个重要的行动可以不经注意而采取,这是一个大的反对。

    有什么线索吗?

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

    3 回复  |  直到 15 年前
        1
  •  4
  •   Craig Stuntz    15 年前

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

    所以问题就变成了,你如何解决你在NHiberinate层列出的缺点?

    过滤出有用的实体就足够简单了。我可能会通过实体类型上的自定义属性来实现这一点。您可以标记您想要跟踪的实体,或者不想跟踪的实体;以容易的为准。

    弄清楚控制器的真正意图是困难的。我将对您是否可以“获得httpContext”提出质疑;我认为在存储库中这样做不是一个好主意,因为关注点的分离。存储库不应依赖于Web。一种方法是在存储库中为您希望跟踪的不同操作创建自定义方法;如果这些编辑的其他方面行为不同,例如不同的安全性,则这一点尤其有吸引力。另一种方法是通过比较对象的新旧版本来检查更改,并得出更改的实际性质。第三种方法是不尝试派生更改的性质,只将前后版本存储在日志中,这样读取日志的人就可以自己解决问题。

        2
  •  1
  •   Adrian Grigore    15 年前

    我宁愿把它放在数据层(在你的例子中是NHibernate)。把它放在控制器中,并要求其他人(或者你自己,将来)实现控制器,这与面向对象的设计原则相冲突。

        3
  •  1
  •   Jamie Ide    15 年前

    我用NHibernate做这个。需要审计的对象实现IAudTable接口,我使用拦截器对实现IAudTable的任何对象进行审计,方法是截取onFlushDirty、OnDelete和OnSave。