4

我必须在表单中显示一个对象(一个 POCO 类)。

在我的控制器中,我从对象存储库中获取对象数据。

但是在表格中,我还必须显示一些关于对象的额外数据,比如国家名称而不是 countryid、分配的人数(从 1:N 关系中获取)、编辑历史(获取来自另一个表)和位“CanBeCancelled”。

问题是:我应该把这个逻辑放在哪里?

我想出了这些替代方案:

  • 存储库本身:创建一个额外的函数来返回这个确切的视图模型
  • 转换服务,将类转换为视图模型(它知道从哪里获取数据)
  • 控制器:它知道要在视图(模型)中显示哪些数据,因此它应该从不同的存储库中获取所有数据

什么是放置此逻辑的好方法(对于“此逻辑”,我的意思是知道在存储库 A 中获取人数的逻辑,由存储库 B 获取历史记录,由 CountryRepository 和布尔值获取国家名称'CanBeCancelled' 由 StateEngine 服务获取)?

4

1 回答 1

5

如果没有其他限制,我会遵循单一职责原则所述的简单规则——每一层都应该做自己的工作,并假设其他层正确地完成他们的工作。在这种情况下,存储库返回业务对象,服务处理业务对象,控制器只知道如何正确显示对象。详细说明:

  1. 人数,历史和国名已经在存储中,应该来自那里。所以存储库应该返回一个完整的对象——只要操作是关于同一个实体的。

  2. 当流程中涉及多个实体时,服务负责调用相应的存储库并构造一个对象。

  3. 根据业务规则计算出来的东西也是服务对象的工作。

  4. 控制器通过调用服务的单个方法接收完整的对象并显示它

一旦您决定更改某些内容,例如关于如何允许取消对象的业务规则,这种方法的好处就会很明显。这与访问数据库无关,也不涉及应用程序UI,因此在这种情况下您唯一要更改的地方是服务实现。这种方法允许您做到这一点,而无需更改存储库和控制器的代码。

于 2012-12-03T13:36:47.110 回答