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

Cas*_*ins 9 .net nhibernate

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

UI BLL DAL

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

这是否违背了分离每一层的典型思路,每层只依赖于它下面的层?我在这里错过了什么?

Mar*_*erl 9

我可以举个例子,我通常将NHibernate与n层架构进行分层:

数据访问层

映射示例:

public class CategoryMap : ClassMap<Domain.Entities.Category>
{
    public CategoryMap()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

业务层

  • 存储库:BaseRepository

存储库的示例:

public class CategoryRepository : BaseRepository<Domain.Entities.Category>,
    Domain.DataInterfaces.Business.Repositories.ICategoryRepository
{
    public CategoryRepository(ISession session)
        : base(session)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)
  • BaseRepository(CRUD,GetById,GetAll)

基本存储库的示例:

public class BaseRepository<T> : IBaseRepository<T>
{
    public ISession Session { get; set; }

    public BaseRepository(ISession session)
    {
        Session = session;
    }
 }
Run Code Online (Sandbox Code Playgroud)

域层

  • DataInterfaces(IRepository,IBaseRepository)
  • 实体:BaseEntity
  • 持久性(IEntity,IBaseEnity)

因此,唯一引用NHibernate的层实际上是数据层和business(NHibernate.ISession).域层在所有层之间共享,并且不了解NHibernate.为简单起见,您可以将业务和数据层合并为一个层.我通常倾向于将它们分开,但这取决于项目规模.

在此输入图像描述

如果你真的想要分离,我还建议你看一下依赖注入,以减少不同层之间的依赖关系.

希望对你有所帮助.