我有机会将 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 上的一个方法,该方法将执行存储过程。这是我不清楚的地方:
也许这只是一个宗教论点,人们对实体是否应该引用其 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/