我正在一个项目中使用NHibernate,并且需要进行数据审计。 我在这篇文章中发现了关于IInterceptor接口的讨论。
你更喜欢哪种审计数据的方式? 你使用数据库触发器吗? 还是类似文章中讨论的方式?
我正在一个项目中使用NHibernate,并且需要进行数据审计。 我在这篇文章中发现了关于IInterceptor接口的讨论。
你更喜欢哪种审计数据的方式? 你使用数据库触发器吗? 还是类似文章中讨论的方式?
请在NH2.0版本发布后查看下面建议的事件监听器。我的答案已经过时了。
IInterceptor是nhibernate中推荐的一种非侵入式修改任何数据的方式。它还可以用于加密/解密数据,而无需您的应用程序代码知道。
数据库触发器将日志记录的责任(一个应用程序关注点)移动到DBMS层,这实际上将您的日志记录解决方案与数据库平台绑定在一起。通过封装持久层中的审计机制,您保留了平台独立性和代码可移植性。
我在几个大型系统的生产代码中使用拦截器来提供审计功能。
我知道这是一个旧问题。但是我想在NH 2.0的新事件系统的光环下回答这个问题。与拦截器相比,事件监听器更适合用于类似审计功能。Ayende上个月在他的博客中写了一个很好的例子。这是他博客文章的链接 -
我很喜欢提到的拦截器方法,并在我目前正在处理的项目中使用它。
然而,这种方法的一个明显劣势值得强调的是,这种方法只会审计通过你的应用程序进行的数据更改。任何直接的数据修改,例如不定期需要执行的ad-hoc SQL脚本(这总是会发生的!),除非你同时记得执行审计表插入操作,否则将不会被审计。
public interface IRepository<EntityType> where EntityType:IAuditably
{
public void Save(EntityType entity);
}
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),您可以构建所有内容,而不需要您的其余代码知道您正在进行审计。
当然,如何审计级联集合的元素是另一个完全不同的问题...