使用NHibernate设置最后修改时间和修改人的最佳实践是什么?

5

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

public class Product
{ 
  int Id;
  int Name;
  DateTime CreatedOn;
  int CreatedByUserId;
  DateTime LastModifiedOn;
  int LastModifiedByUserId;
}

如何在NHibernate中处理这些内容是最佳实践?通过使用拦截器,类似于这里所描述的方式?

2个回答

1

我想我早就知道那会是答案 :) 我猜我并不是在寻找“最好的”,而是“推荐的”。 - Mark Boltuc
我们做类似的事情,但是将 Func<TID> 传递给我们的 "审核员"。为了测试,我们只需返回一个固定值,在生产中,我们传递一个调用 HttpContext.Current.User 的函数。 - Ben Foster
@Diego Mijelshon 呃,那真的很丑...不幸的是我想我也得这么做! - richard

0

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

我认为,在服务层构造对象并添加创建者本身,然后将整个对象(已经填充了创建者)传递到nHibernate以进行持久化是完全有效的。创建者将以与任何其他属性相同的方式保存到数据库中。


我的应用程序(ASP.NET MVC)使用存储库等结构进行组织,因此传递用户信息将会很有趣。我绝对不希望存储库直接引用HttpContext,因此我需要找到一种优雅的方式将该信息传递给存储库。 - Mark Boltuc
你可以制定策略;创建某种 ICurrentUserProvider 并从控制器/服务层传递下去。ICurrentUserProvier 将有一个委托指向使用 HttpContext 解析当前用户的方法。尽管如此,这仍然违反了 DIP 原则,如果可能的话应该避免使用。 - reustmd
我使用IoC在需要的地方注入用户,就像在autofac中这样:builder.Register(c => HttpContext.Current.User).HttpRequestScoped(); - UpTheCreek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接