1

假设我的WinForms应用程序有一个业务实体 Order,该实体在多个视图中使用,每个视图处理应用程序中的不同域或用例。例如,一个管理订单,另一个挖掘一个订单并显示附加数据。

如果我使用 nHibernate(或任何其他 ORM)并为每个视图(或每个 db 操作)使用一个 session/dataContext,我最终会为同一个 Order 获得两个不同的实例(假设 orderId = 1)。尽管在功能上是相同的实体,但在技术上它们是两个不同的实例。是的,我可以实现 Equals/GetHashcode 以使它们“看起来”相同。

为什么要为每个实体使用单个实例,而不是为每个视图或每个用例选择私有实例?

拥有单个实例具有共享 INotifyPropertyChanged 事件和共享其他(非持久性)数据的优势。

在每个视图中都有一个私有实例将为您提供视图级别上撤消功能的灵活性。在上面的示例中,我允许用户更改订单详细信息,并给予他们不保存更改的灵活性。在这里,视图/用例之间的同步发生在数据持久性级别。

你的论点是什么?

4

2 回答 2

2

应该实现Equals/GetHashCode方法。这是使用 ORM 时的推荐做法。

此外,您通常应该坚持“一个视图,一个会话”的口头禅。当您的视图更改或失去焦点时,保留所有对象。如果您真的需要跨视图共享实体……那就去做吧!有时你必须。

再一次,因为当我们从实体和行类型的角度查看业务对象时,我们不应该关心“对象”级别的相等性。

于 2010-03-16T21:21:41.073 回答
0

我不能代表 ORM,但我认为您在一定程度上回答了您自己的问题。您已经为这两种选择提供了优缺点:从绝对意义上来说,既不是对也不是错。

根据您的情况,这些选项只有正确或错误。如果共享信息有意义,请使用单个共享实例,但如果撤消能力更重要,请使用多个/私有实例。

您可能还有其他问题也推动了决策:考虑 NFR(或“疾病”)和系统的上下文。例如,如果性能是一个关键问题,并且您知道您将拥有庞大的用户群,那么这可能有助于建议一个选项而不是另一个选项,或者迫使您从头开始重新考虑。

最后 - 你有“订单”,其他实体呢 - 他们是如何被处理的?
或者,如果你没有,当/如果你有会发生什么?这会对您的架构产生任何影响吗?

于 2010-03-17T03:28:57.683 回答