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

时间:2011-01-31 20:51:37

标签: .net nhibernate

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

UI BLL DAL

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

这不符合分离每一层的典型想法,每层只依赖于它下面的层吗?我在这里缺少什么?

2 个答案:

答案 0 :(得分:9)

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

数据访问层

映射示例:

public class CategoryMap : ClassMap<Domain.Entities.Category>
{
    public CategoryMap()
    {
        ...
    }
}

业务层

  • 存储库:BaseRepository

存储库示例:

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

基础存储库的示例:

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

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

域名图层

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

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

enter image description here

如果您真的想要分离,我还建议您查看dependency injection以减少不同层之间的依赖关系。

希望对你有所帮助。

答案 1 :(得分:4)

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

表示层使用NHibernate作为Data Mapper(和Unit of Work)将其Domain Model(即其业务逻辑)与持久性问题分离。