我必须在表单中显示一个对象(一个poco类)。
在我的控制器中,我从对象存储库获取对象数据。
但在表单中,我还必须显示有关对象的一些额外数据,如国家名称而不是国家ID、分配的人数(从1:n关系中提取)、编辑历史(从另一个表中提取)和位“CanbeCancelled”。
问题是:我应该把这个逻辑放在哪里?
我想出了这些选择:
存储库本身:创建一个额外的函数来返回
精确视图模型
转换服务,它将类转换为
viewmodel(它知道从哪里获取数据)
控制器:它知道
要在视图(模型)中显示哪些数据,因此它应该获取所有数据
从不同的存储库
放置此逻辑的好方法是什么(使用“this logic”我指的是知道存储库A中获取人数、存储库B获取历史记录和存储库存储库获取countryname以及状态引擎服务获取布尔值“canbecancelled”的逻辑)?

最佳答案

如果没有其他约束,我将遵循Single Responsibility Principle所述的简单规则-每一层都应该做自己的工作,并假定其他层正确地完成自己的工作。在这种情况下,存储库返回业务对象,服务处理业务对象,而控制器只知道如何正确显示对象。具体内容:
储存的人数、历史和国家名称,应该是从那里来的。所以存储库应该返回一个完整的对象-只要操作是相同的实体。
当流程中涉及多个实体时,服务负责调用相应的存储库并构造一个对象。
根据业务规则计算出来的东西也是服务对象的工作。
控制器通过调用服务的单个方法接收完整的对象并显示它
这种方法的好处将在您决定更改某个内容时体现出来,比如关于如何允许取消对象的业务规则。这与对数据库的访问无关,也不涉及应用程序ui,因此在本例中,您唯一要更改的地方是服务实现。这种方法允许您这样做,而无需更改存储库和控制器的代码。

09-25 16:55
查看更多