nhibernate – 实体是否应该对其DAO有所了解?

我有机会将NHibernate引入我的小组,将其与一些新组件一起使用,这些组件将被添加到遗留应用程序中.我正试着用NHibernate的DAO模式来解决这个问题,而且我很难解决一个架构问题.

在我的虚构例子中,假设我有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上的方法注入CarDAO(Car.ConvertToRightHandDrive(carDAO))
>其他一些选择?

也许这只是一个宗教论点,人们对一个实体是否应该提及其DAO(或任何其他DAO,就此而言)有不同的看法.我一直在搜索StackOverflow已经有一段时间了,并且已经围绕这个主题进行了几次讨论;但是,我对这个特定场景中的人们的意见感兴趣.

最佳答案 我总是被告知考虑它的方式是实体应该尽可能少,并且各种对象应该对实体执行操作.实体本身不应该知道DAL,或者他们失去了数据存储的无知

因此,在这种情况下,可能依赖于CarDAO的CarManager(或类似物)应具有ChangeToRightHandDrive(Car)方法.

哦,还有一个让CarManager执行复杂操作的另一个好处就是你不依赖于存储过程 – 这几乎肯定是一个宗教问题,但我更喜欢在我的代码中拥有所有逻辑而不是依赖于SP(那里)有一些例外,但通常只有大型集合).这意味着如果您更改为另一个DAL(比如XML),则无需在DAL / DAO中重新实现SP – 否则,您最终会在DAL中嵌入业务逻辑.

点赞