假设我的 WinForms 应用程序具有业务实体Order,该实体用于多个视图,每个视图处理应用程序中的不同域或用例。例如,一个管理订单,另一个订购一个订单并显示其他数据。
如果我使用nHibernate(或任何其他ORM)并且每个视图使用一个session / dataContext(或者每个db操作),我最终会得到同一个Order的两个不同实例(假设orderId = 1) 。虽然在功能上是同一个实体,但它们在技术上是两个不同的实例。是的,我可以实现Equals / GetHashcode,使它们“看起来”相同。
为什么每个实体与每个视图或每个用例的私有实例一起使用单个实例?
拥有单个实例具有共享INotifyPropertyChanged事件和共享其他(非持久性)数据的优势。
在每个视图中拥有一个私有实例,可以在视图级别为您提供撤消功能的灵活性。在上面的示例中,我允许用户更改订单详细信息,并为他们提供不保存更改的灵活性。这里,视图/用例之间的同步发生在数据持久性级别上。
你的论点是什么?
答案 0 :(得分:2)
您应该实施Equals
/ GetHashCode
方法。这是使用ORM时的推荐做法。
此外,您通常应该坚持使用“One View,One Session”口头禅。当视图改变或失去焦点时,保留所有对象。如果你真的需要跨视图共享实体......那么做到这一点!有时候你必须这样做。
再次,因为当我们从实体和行类型的角度来看业务对象时,我们不应该关注“对象”级别的平等。
答案 1 :(得分:0)
我不能代表ORM发言,但我认为你在某种程度上回答了你自己的问题。你为这两种选择提供了利弊:从绝对意义上说,既不对也不错。
根据您的具体情况,选项是对还是错。如果共享信息有意义使用单一共享实例,但如果撤消功能更重要,则使用多个/私有实例。
您可能还有其他问题可以推动决策:考虑NFR(或“疾病”)和系统的背景。例如,如果性能是一个关键问题,并且您知道您将拥有大量用户群,那么这可能有助于建议一个选项超过另一个选项,或者迫使您从头开始重新考虑它。
最后 - 你有“订单”,其他实体怎么样 - 它们是如何处理的呢? 或者,如果你没有,如果你这样做会发生什么?你的架构会有什么影响吗?