我必须在表单中显示一个对象(一个POCO类)。
在我的控制器中,我从对象存储库中获取对象数据。
但在表单中,我还必须显示一些关于该对象的额外数据,例如国家名称而不是countryid,分配的人数(从1:N关系中获取),编辑历史(从另一个表中取出)和'CanBeCancelled'。
问题是:我应该把这个逻辑放在哪里?
我提出了这些替代方案:
放置此逻辑的好方法是什么(使用'this logic',我的意思是知道在存储库A中获取人数的逻辑,历史记录由存储库B提取,CountryRepository提取国家/地区名称并且StateEngine服务提取布尔值'CanBeCancelled'?
答案 0 :(得分:5)
如果没有其他限制,我会遵循Single Responsibility Principle所述的简单规则 - 每个层应该自己完成工作,并假设其他层正确地完成了它们的工作。在这种情况下,存储库返回业务对象,服务处理业务对象,控制器只知道如何正确显示对象。详情:
人数,历史记录和国家/地区名称已经存储,应该来自那里。因此,存储库应该返回一个完整的对象 - 只要操作是关于同一个实体。
当进程中涉及多个实体时,服务负责调用相应的存储库并构建对象。
根据业务规则计算出来的东西也是服务对象的工作。
Controller通过调用服务的单一方法接收完整对象并显示它
一旦您决定更改某事,这种方法的好处就会很明显,比如关于如何取消该对象的业务规则。这与访问数据库无关,也不涉及应用程序UI,因此在这种情况下,您唯一想要更改的地方是服务实现。这种方法允许您这样做,而无需更改存储库和控制器的代码。