在我的应用程序中,我们需要捕获创建和修改记录的时间以及执行这些操作的用户。所以我可能有一个类似的对象:
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 中处理这些的最佳实践是什么?通过使用类似于此处描述的拦截器?
我认为没有“最佳”做法,但为此使用事件侦听器更为常见。在http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx有一个很好的例子
您需要考虑的一件事是您需要将该 userId 存储在某处。我目前正在通过在启动时在侦听器上分配一个静态属性来做到这一点。它不漂亮,但它完成了工作。
我同意 Diego 的观点,即我认为没有最佳实践。这取决于您的应用程序上下文。在 Diego 的链接中,要在持久性(nHibernate)级别使用事件侦听器,它需要知道如何查找当前用户。根据您的应用程序,这可能没有意义。例如,如果您正在编写一个 ASP.NET MVC 应用程序,您真的希望您的持久层依赖 HttpContext 来了解用户吗?是的,您可以传递某种类型的策略,但这似乎并不总是正确的做法。
我认为让您的服务层构造对象并添加创建者本身是完全有效的。然后将创建者已经水合的整个对象传递给 nHibernate 以保持。创建者将像任何其他属性一样保存到数据库中。