采用传统的3层方法(不一定是3层):
UI BLL DAL
NHibernate如何适合?在大多数情况下,我看到人们允许NHibernate直接填充域对象/实体,这显然需要NHibernate对这些实体的引用。如果域实体是BLL的一部分,这似乎需要从DAL(NHibernate所在的位置)到BLL(域对象所在的位置)的引用。
这不符合分离每一层的典型想法,每层只依赖于它下面的层吗?我在这里缺少什么?
答案 0 :(得分:9)
我可以举个例子,我通常将NHibernate与n层架构进行分层:
数据访问层
SessionFactory
映射示例:
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;
}
}
域名图层
因此,唯一引用NHibernate的层实际上是数据层和业务(NHibernate.ISession
)。域层在所有层之间共享,并且不了解NHibernate。为简单起见,您可以将业务和数据层合并为一个层。我通常倾向于将它们分开,但这取决于项目规模。
如果您真的想要分离,我还建议您查看dependency injection以减少不同层之间的依赖关系。
希望对你有所帮助。
答案 1 :(得分:4)
NHibernate最适合不同的架构(仍然是分层的,但不是以相同的方式堆叠)。
表示层使用NHibernate作为Data Mapper(和Unit of Work)将其Domain Model(即其业务逻辑)与持久性问题分离。