nhibernate - 一个实体应该知道它的 DAO 吗?

标签 nhibernate domain-driven-design dao

我有机会将 NHibernate 与一些添加到遗留应用程序的新组件一起使用,从而将 NHibernate 介绍给我的团队。我正在尝试将 DAO 模式与 NHibernate 一起使用,但我被一个架构问题难住了。

在我的虚构示例中,假设我有 CarDAO 和 Car 实体:

public interface CarDAO {
    Car FindById(int id)
    ... // everything else
}

public interface Car {
    ... various properties and methods
}

我需要能够将汽车转换为右手驾驶。由于这将是一个非常复杂的操作,我需要执行一个存储过程。我不清楚 ConvertToRightHandDrive() 方法应该去哪里。

将方法放在 Car 上对我来说很有意义,并让它调用 CarDAO 上的一个方法,该方法将执行存储过程。这是我不清楚的地方:
  • Car 是否应该引用 CarDAO 并调用 CarDAO.ConvertToRightHandDrive?
  • 是否应该有某种 CarService 层调用 CarDAO.ConvertToRightHandDrive?
  • 通过 Car 上的方法注入(inject) CarDAO 怎么样 (Car.ConvertToRightHandDrive(carDAO))
  • 其他选择?

  • 也许这只是一个宗教论点,人们对实体是否应该引用其 DAO(或任何其他 DAO,就此而言)有不同的看法。我一直在搜索 StackOverflow 一段时间,并看到了围绕这个主题的几个讨论;但是,在这种特殊情况下,我会对人们的意见感兴趣。

    最佳答案

    我总是被告知要考虑它的方式是实体应该尽可能少,并且各种对象应该对实体执行操作。实体本身不应该知道 DAL,否则他们会失去对数据存储的无知

    所以在这种情况下,CarManager (或类似的)可能依赖于 CarDAO应该有 ChangeToRightHandDrive(Car)方法。

    哦,还有一个拥有 CarManager 的优势执行复杂操作的是您不依赖于存储过程 - 这几乎可以肯定是一个宗教问题,但我更喜欢在我的代码中包含所有逻辑而不是依赖于 SP(有一些异常(exception),但通常只有大套)。这意味着如果您更改为另一个 DAL (比如 XML),您不需要在 DAL/DAO 中重新实现您的 SP - 否则,您最终会在 DAL 中嵌入业务逻辑。

    关于nhibernate - 一个实体应该知道它的 DAO 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3557215/

    相关文章:

    java - dao(或者可能是存储库)应该将 id 或实体作为参数

    java - Spring MVC 域对象处理最佳实践

    vb.net - NHibernate 多对多条件创建多个数据库调用

    nhibernate - Entity Framework 与 nHibernate 的性能、学习曲线整体特性

    wcf - 服务契约与领域对象

    go - 在 DDD 中,一个实体和存储库可以从多个表中提取吗?

    asp.net - 我可以在 GoDaddy 上使用 NHibernate 吗?

    NHibernate 3.2 : SchemaExport not working with SQLite

    domain-driven-design - 域模型可以知道存储库吗?

    jpa - Spring Roo : use JPA entity as a DAO