什么';使用NHibernate设置上次修改和谁修改的最佳实践是什么?

什么';使用NHibernate设置上次修改和谁修改的最佳实践是什么?,nhibernate,change-tracking,Nhibernate,Change Tracking,在我的应用程序中,我们需要捕获记录创建和修改的时间以及用户执行这些操作的时间。所以我可能会有一个类似这样的对象: public class Product { int Id; int Name; DateTime CreatedOn; int CreatedByUserId; DateTime LastModifiedOn; int LastModifiedByUserId; } NHibernate处理这些问题的最佳实践是什么?通过使用拦截器,就像上面描述的那样 我

在我的应用程序中,我们需要捕获记录创建和修改的时间以及用户执行这些操作的时间。所以我可能会有一个类似这样的对象:

public class Product
{ 
  int Id;
  int Name;
  DateTime CreatedOn;
  int CreatedByUserId;
  DateTime LastModifiedOn;
  int LastModifiedByUserId;
}
NHibernate处理这些问题的最佳实践是什么?通过使用拦截器,就像上面描述的那样

我认为没有“最佳”实践,但使用事件侦听器在这方面更为常见。这里有一个很好的例子


你需要考虑的一件事是你需要把那个用户ID存储在某个地方。我目前正在通过在启动时为侦听器分配一个静态属性来实现这一点。这并不漂亮,但它完成了任务。

我同意迭戈的观点,我认为没有最佳实践。这取决于您的应用程序上下文。在Diego的链接中,要在持久性(nHibernate)级别使用事件侦听器,它需要知道如何查找当前用户。根据您的应用程序,这可能没有意义。例如,如果您正在编写一个ASP.NET MVC应用程序,您真的希望您的持久层依赖于HttpContext来了解用户吗?是的,你可以通过某种策略,但这似乎并不总是正确的做法


我认为让您的服务层构造对象并添加创建者本身是完全有效的。然后,在造物主已经水合的情况下,将整个物体传递到nHibernate以保持其存在。创建者将以与任何其他属性相同的方式保存到数据库中。

不知怎的,我想这就是答案:)我想我不是真的在寻找“最佳”,而是“建议”我们做类似的事情,但将
Func
传递给我们的“审核者”。对于测试,我们只需要返回一个固定值,在生产中,我们传递一个调用
HttpContext.Current.User
@Diego Mijelshon的函数,这太难看了……不幸的是,我想我也必须这样做!我的应用程序(ASP.NET MVC)是使用存储库构建的,因此传递用户信息将非常有趣。我绝对不希望回购协议直接引用HttpContext,因此我需要找到一种方式,将这些信息优雅地传递给存储库;创建某种ICurrentUserProvider,并将其从控制器/服务层向下传递。ICurrentUserProvider将有一个委托,指向使用HttpContext解析当前用户的方法。也就是说,这仍然违反了DIP,如果可能的话应该避免;