【问题标题】:How do you implement a 3 layer model with NHibernate?您如何使用 NHibernate 实现 3 层模型?
【发布时间】:2011-06-18 20:43:09
【问题描述】:

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

用户界面 BLL 达尔

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

这难道不违背分离每一层的典型思想,每一层只依赖于它下面的一层吗?我在这里错过了什么?

【问题讨论】:

标签: .net nhibernate


【解决方案1】:

我可以给你一个例子,我通常如何使用 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;
    }
 }

域层

  • 数据接口(IRepository、IBaseRepository)
  • 实体:BaseEntity
  • 持久性(IEntity、IBaseEnity)

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

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

希望对你有所帮助。

【讨论】:

  • 谢谢马丁。 NHibernate 究竟返回到业务层的是什么?也许一个简短的代码示例可以解释?
  • DAL 仅由 BL 调用并返回 NHibernate 会话和 NHibernate 映射。而已。我添加了一些示例,希望它变得更加清晰。
  • 存储库不应包含业务逻辑...它们应位于 DAL 中。
  • @Martin,Category 是领域模型中的一个实体,对吗? NHibernate 会话将通过存储库返回 Category 的实例,对吗?
  • NHibernate 是 DAL。存储库可以包含业务逻辑,在这种情况下您可以将其称为服务。
【解决方案2】:

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

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

【讨论】:

  • 在你描述的架构中,层是什么,它们是如何相互引用的?
  • 我会说你得到了一个表示层,它知道对象关系映射器域模型(业务层,如果你喜欢),而 ORM 也知道领域模型。
  • 这完全正确。 NHibernate 非常适合与洋葱架构一起使用。见google.com/…
猜你喜欢
  • 1970-01-01
  • 2012-07-30
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
相关资源
最近更新 更多