FluentNHibernate工作单元/存储库设计模式问题

时间:2010-04-02 23:39:36

标签: nhibernate fluent-nhibernate entity business-logic

我想我在这里陷入僵局。我有一个我使用FluentNHibernate(ORM)/ SQLite(文件数据库)从头开始构建的应用程序。我决定实施工作单元和存储库设计模式。我正处于需要考虑最终游戏的地步,它将作为WPF Windows应用程序(使用MVVM)开始,并最终实现Web服务/ ASP.Net作为UI。

现在我已经为ORM创建了域对象(实体)。现在我不知道如何在ORM之外使用它。有关它的问题包括:

  • 我应该直接将ORM实体对象用作MVVM中的模型吗?如果是,我是否在这些实体对象中放置业务逻辑(例如某些值必须为正且大于另一个属性)?这当然是更简单的方法,也是我现在倾向于的方法。但是,会不会有破坏这个计划的陷阱?
  • 如果上面的答案是否定的,那么我是否要创建一组新的类来实现业务逻辑并将其用作MVVM中的模型?我如何处理模型对象和实体对象之间的转换?我想类型转换器实现在这里可以很好地工作。

1 个答案:

答案 0 :(得分:3)

要回答问题的第一部分,是的,您的业务逻辑和验证应该放在您的实体中。 NHibernate的观点是让你设计你的实体是无知的持久性。这意味着,如果您不关心持久性,您应该尽可能地设计实体。这并不完全可行,因为您很快就会发现(您需要将属性设置为虚拟以支持延迟加载,如果您想使用NHibernate Validator,您将使用验证属性来装饰您的属性),但在大多数情况下,NHibernate可以很好地避开你的方式。

至于是否使用您的实体作为模型,您将获得混合评论。理想情况下,您可以创建单独的viewmodel类,并从实体映射到viewmodel,以便您的视图只能访问所需的最少信息。这在预防N+1 access issues方面也有很长的路要走。然而,这样做往往是一个巨大的痛苦。当然,像AutoMapper这样的工具可以让您更轻松地将实体属性转换为视图模型。