在哪里加载数据以填充具有多个poco类的viewmodel

时间:2012-12-03 13:26:42

标签: c# asp.net-mvc

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

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

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

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

我提出了这些替代方案:

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

放置此逻辑的好方法是什么(使用'this logic',我的意思是知道在存储库A中获取人数的逻辑,历史记录由存储库B提取,CountryRepository提取国家/地区名称并且StateEngine服务提取布尔值'CanBeCancelled'?

1 个答案:

答案 0 :(得分:5)

如果没有其他限制,我会遵循Single Responsibility Principle所述的简单规则 - 每个层应该自己完成工作,并假设其他层正确地完成了它们的工作。在这种情况下,存储库返回业务对象,服务处理业务对象,控制器只知道如何正确显示对象。详情:

  1. 人数,历史记录和国家/地区名称已经存储,应该来自那里。因此,存储库应该返回一个完整的对象 - 只要操作是关于同一个实体。

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

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

  4. Controller通过调用服务的单一方法接收完整对象并显示它

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