我在一个项目中使用 NHibernate,我需要进行数据审计。我在 codeproject 上找到了这篇讨论 IInterceptor 接口的文章。
您首选的审计数据方式是什么?你使用数据库触发器吗?您是否使用类似于文章中讨论的内容?
我在一个项目中使用 NHibernate,我需要进行数据审计。我在 codeproject 上找到了这篇讨论 IInterceptor 接口的文章。
您首选的审计数据方式是什么?你使用数据库触发器吗?您是否使用类似于文章中讨论的内容?
对于 NHibernate 2.0,您还应该查看Event Listeners。这些是 IInterceptor 接口的演变,我们成功地将它们用于审计。
[编辑]
发布 NH2.0 后,请查看下面建议的事件监听器。我的回答已经过时了。
IInterceptor 是在 nhibernate 中以非侵入方式修改任何数据的推荐方法。它对于解密/加密数据也很有用,而您的应用程序代码不需要知道。
数据库上的触发器正在将日志记录(应用程序关注)的责任转移到 DBMS 层,它有效地将您的日志记录解决方案与您的数据库平台联系起来。通过将审计机制封装在持久层中,您可以保持平台独立性和代码可传输性。
我在生产代码中使用拦截器在一些大型系统中提供审计。
我更喜欢您提到的 CodeProject 方法。
数据库触发器的一个问题是它让您别无选择,只能使用与 ActiveDirectory 结合的集成安全性来访问您的 SQL Server。原因是您的连接应该继承触发连接的用户的身份;如果您的应用程序使用命名为“sa”的帐户或其他用户帐户,“用户”字段将仅反映“sa”。
这可以通过为应用程序的每个用户创建一个命名的 SQL Server 帐户来覆盖,但这对于非 Intranet、面向公众的 Web 应用程序来说是不切实际的。
我确实喜欢提到的拦截器方法,并在我目前正在从事的项目中使用它。
但是,值得强调的一个明显缺点是这种方法只会审核通过您的应用程序所做的数据更改。除非您记得同时执行审计表插入,否则您可能需要不时执行的任何直接数据修改,例如临时 SQL 脚本(它总是会发生!)都不会被审计。
我知道这是一个老问题。但我想根据 NH 2.0 中的新事件系统来回答这个问题。事件监听器比拦截器更适合审计类功能。Ayende 上个月在他的博客上写了一个很好的例子。这是他博客文章的网址——
作为一种完全不同的方法,您可以在存储库中使用装饰器模式。
说我有
public interface IRepository<EntityType> where EntityType:IAuditably
{
public void Save(EntityType entity);
}
然后,我们就有了 NHibernateRepository:
public class NHibernateRepository<EntityType>:IRepository<EntityType>
{
/*...*/
public void Save ( EntityType entity )
{
session.SaveOrUpdate(entity);
}
}
然后我们可以有一个审计存储库:
public class AuditingRepository<EntityType>:IRepository<EntityType>
{
/*...*/
public void Save ( EntityType entity )
{
entity.LastUser = security.CurrentUser;
entity.LastUpdate = DateTime.UtcNow;
innerRepository.Save(entity)
}
}
然后,使用 IoC 框架(StructureMap、Castle Windsor、NInject),您可以在不知道您正在进行审计的其他代码的情况下构建它。
当然,你如何审计级联集合的元素完全是另一个问题......