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

FluentNHibernate工作单元/存储库设计模式问题,nhibernate,fluent-nhibernate,entity,business-logic,Nhibernate,Fluent Nhibernate,Entity,Business Logic,我想我在这里陷入了僵局。我使用FluentNHibernate(ORM)/SQLite(file db)从头构建了一个应用程序。我决定实现工作单元和存储库设计模式。我现在需要考虑的是最终的游戏,它将以WPF windows应用程序(使用MVVM)开始,并最终实现web服务/ASP.Net作为UI 现在我已经为ORM创建了域对象(实体)。现在我不知道如何在ORM之外使用它。有关问题包括: 我应该直接在MVVM中使用ORM实体对象作为模型吗?如果是,我是否将业务逻辑(例如某些值必须为正且大于另一个

我想我在这里陷入了僵局。我使用FluentNHibernate(ORM)/SQLite(file db)从头构建了一个应用程序。我决定实现工作单元和存储库设计模式。我现在需要考虑的是最终的游戏,它将以WPF windows应用程序(使用MVVM)开始,并最终实现web服务/ASP.Net作为UI

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

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

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


至于是否使用您的实体作为模型,您会得到不同的评价。理想情况下,您可以创建单独的viewmodel类,并将实体映射到viewmodel,以便视图只访问所需的最少信息。这对预防疾病也有很大帮助。然而,这样做往往是一个巨大的痛苦。诚然,有这样的工具可以使将实体属性转换为viewmodel变得更容易。

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


至于是否使用您的实体作为模型,您会得到不同的评价。理想情况下,您可以创建单独的viewmodel类,并将实体映射到viewmodel,以便视图只访问所需的最少信息。这对预防疾病也有很大帮助。然而,这样做往往是一个巨大的痛苦。当然,有这样的工具可以使将实体属性转换为viewmodel变得更容易。

我不知道AutoMapper,谢谢!有了它,创建单独的ViewModel类并使用AutoMapper将它们的属性映射到实体类属性是非常有意义的(也是非常有效的)。简单的展平可能会起作用(或较小的投影)。我知道的第二部分是trickly,需要有人具有扎实的NHibernate/工作单元设计模式知识。如果你想尝试一下,我会很感激的!是的,我对NHibernate不够精通,无法告诉你如何最好地设置它。值得一提的是,我看到了大量不同的方法来建立ISessionFactory、ISession和ITransaction。就我个人而言,我喜欢直接使用它们,并使用控制反转容器将ISession传递到需要它的存储库类中。至于设置它,我不想使用FluentNHibernate文档,因为它非常精简,而且添加工作层单元不会带来复杂性。使用NHibernate、AutoMapper和IoC(StructureMap)有非常好的实现,如果您对我个人如何设置Fluent NHibernate感兴趣,请看我在这里的帖子:我不知道AutoMapper,谢谢!有了它,创建单独的ViewModel类并使用AutoMapper将它们的属性映射到实体类属性是非常有意义的(也是非常有效的)。简单的展平可能会起作用(或较小的投影)。我知道的第二部分是trickly,需要有人具有扎实的NHibernate/工作单元设计模式知识。如果你想尝试一下,我会很感激的!是的,我对NHibernate不够精通,无法告诉你如何最好地设置它。值得一提的是,我看到了大量不同的方法来建立ISessionFactory、ISession和ITransaction。就我个人而言,我喜欢直接使用它们,并使用控制反转容器将ISession传递到需要它的存储库类中。至于设置它,我不想使用FluentNHibernate文档,因为它非常精简,而且添加工作层单元不会带来复杂性。使用NHibernate、AutoMapper和IoC(StructureMap)有非常好的实现。如果您对我个人如何设置Fluent NHibernate感兴趣,请参阅我的帖子: