.net 如何使用NHibernate实现3层模型?

.net 如何使用NHibernate实现3层模型?,.net,nhibernate,.net,Nhibernate,采用传统的三层方法(不一定是三层): 用户界面 BLL 达尔 NHibernate如何适合?在大多数情况下,我看到人们允许NHibernate直接填充域对象/实体,这显然需要NHibernate引用这些实体。如果域实体是BLL的一部分,这似乎需要从DAL(NHibernate所在地)到BLL(域对象所在地)的引用 这是否违背了分离每一层的典型想法,每一层只依赖于它下面的一层?我在这里遗漏了什么?我可以给你一个例子,我通常是如何使用NHibernate为n层体系结构分层的: 数据访问层 NHib

采用传统的三层方法(不一定是三层):

用户界面 BLL 达尔

NHibernate如何适合?在大多数情况下,我看到人们允许NHibernate直接填充域对象/实体,这显然需要NHibernate引用这些实体。如果域实体是BLL的一部分,这似乎需要从DAL(NHibernate所在地)到BLL(域对象所在地)的引用


这是否违背了分离每一层的典型想法,每一层只依赖于它下面的一层?我在这里遗漏了什么?

我可以给你一个例子,我通常是如何使用NHibernate为n层体系结构分层的:

数据访问层

  • NHibernate
    SessionFactory
映射示例:

公共类类别映射:类映射
{
公共类别映射()
{
...
}
}
业务层

  • 存储库:BaseRepository
存储库示例:

公共类CategoryRepository:BaseRepository, Domain.DataInterfaces.Business.Repositories.ICategoryRepository { 公共分类报告(会议期间) :基本(会话) { } }
  • BaseRepository(CRUD、GetById、GetAll)
基本存储库的示例:

公共类基存储库:IBaseRepository
{
公共ISession会话{get;set;}
公共基本存储库(ISession会话)
{
会话=会话;
}
}
域层

  • 数据接口(IRepository、IBaseRepository)
  • 实体:基本实体
  • 持久性(持久性、易变性)
因此,唯一引用NHibernate的层实际上是数据层和业务层(
NHibernate.ISession
)。域层在所有层之间共享,不知道NHibernate。对于Simplice,您可以将业务层和数据层合并到一个层中。我通常倾向于将它们分开,但这取决于项目的大小

如果你真的想分离,我也建议你看看,以减少不同层之间的依赖关系


希望对您有所帮助。

NHibernate最适合不同的体系结构(仍然是分层的,但不是以相同的方式堆叠)


表示层使用NHibernate作为(和)将其(即其业务逻辑)与持久性问题分离。

谢谢Martin。NHibernate究竟是如何回到业务层的?也许一个简短的代码示例可以解释一下?DAL仅由BL调用,并返回NHibernate会话和NHibernate映射。没别的了。我添加了一些示例,希望它变得更清晰。存储库不应该包含业务逻辑。。。它们应该在DAL中。@Martin,类别是域模型中的一个实体,对吗?NHibernate会话将通过存储库返回Category的实例,对吗?NHibernate是DAL。存储库可以包含业务逻辑,在这种情况下,您可以将其称为服务。在您描述的体系结构中,层是什么以及它们如何相互引用?我想说的是,您得到了一个表示层,它了解对象关系映射器和域模型(如果您愿意,可以称为业务层),而ORM也知道域模型,这是完全正确的。NHibernate非常适合用于洋葱结构。请参阅。您可以使用以下哪种方法演示设计分层NHibernate应用程序的最佳方法:
public class CategoryMap : ClassMap<Domain.Entities.Category>
{
    public CategoryMap()
    {
        ...
    }
}
public class CategoryRepository : BaseRepository<Domain.Entities.Category>,
    Domain.DataInterfaces.Business.Repositories.ICategoryRepository
{
    public CategoryRepository(ISession session)
        : base(session)
    {
    }
}
public class BaseRepository<T> : IBaseRepository<T>
{
    public ISession Session { get; set; }

    public BaseRepository(ISession session)
    {
        Session = session;
    }
 }