Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在何处加载数据以使用多个poco类填充viewmodel_C#_Asp.net Mvc - Fatal编程技术网

C# 在何处加载数据以使用多个poco类填充viewmodel

C# 在何处加载数据以使用多个poco类填充viewmodel,c#,asp.net-mvc,C#,Asp.net Mvc,我必须在表单中显示一个对象(一个POCO类) 在我的控制器中,我从对象存储库获取对象数据 但是在表单中,我还必须显示一些关于对象的额外数据,比如国家名称而不是countryid、分配的人数(从1:N关系中获取)、编辑历史(从另一个表中获取)以及位“CanBeCancelled” 问题是:我应该把这个逻辑放在哪里? 我提出了以下备选方案: 存储库本身:创建一个额外的函数来返回 精确视图模型 conversionservice,它将类转换为 viewmodel(它知道从哪里获取数据) 控制员:它知

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

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

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

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

我提出了以下备选方案:

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

放置此逻辑的好方法是什么(使用“this logic”(此逻辑)我指的是知道在存储库a中获取人数、由存储库B获取历史、由CountryRepository获取countryname以及由StateEngine服务获取布尔值“CanBeCancelled”(CanBeCancelled)的逻辑)

如果没有其他约束,我将遵循一条简单的规则——每一层都应该做自己的工作,并假设其他层都正确地做自己的工作。在这种情况下,存储库返回业务对象,服务处理业务对象,控制器只知道如何正确显示对象。详情如下:

  • 人员数量、历史和国家名称已在存储中,并且应来自存储。所以存储库应该返回一个完整的对象——只要操作是关于同一个实体的

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

  • 根据业务规则解决的问题也是服务对象的任务

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


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

    Ok,关于项目1:不确定存储库调用其他存储库与服务调用其他存储库。这个repo是否应该知道如何获取特定viewmodel的数据。关于第3项:这也是我通常的做法,让服务类负责最终结果。这种类称为门面吗?@Michel,第1项——实际上这一切都取决于具体情况。根据存储库模式,一个存储库应该完全关注一个实体。一旦流程中涉及多个实体,服务就开始负责该工作。我可能有点误会,稍后会更新答案。至于外观,这是一个稍微不同的概念。Facade是关于简化一些复杂系统的接口的。这些问题的出现是因为我很久以前(从Delphi开发人员那里)就学会了OO,他们过去常常像当年提出的OO一样,把关于对象的一切都放在那个对象中。因此PErson类拥有关于PErson的所有逻辑、所有属性、所有方法、所有行为,甚至可以将自己保存到数据库中的知识。我今天读到的很多模式仍然认为这是一条路要走。但在我现在读的其他书籍中,我们必须分离关注点,因此所有内容都在一个单独的对象中,因此我必须为行为创建POCO、存储库和服务。