6

我的 mvc3 项目有以下几层。

控制器 -> 服务 -> 存储库。

我需要将 ViewModel 映射到 Entity,不确定哪一层是放置代码的正确层。

我知道它的控制器或服务,请让我知道我应该使用哪一个,如果可以请告诉我原因。

谢谢你。

4

1 回答 1

10

我需要将 ViewModel 映射到 Entity,不确定哪一层是放置代码的正确层。

当然是控制器。服务层和存储库层不知道视图模型的含义。他们只操纵领域模型。

因此,在控制器内部,您使用.Map<TSource, TDest>调用在域模型和视图模型之间来回映射。但是映射定义本身(.CreateMap<TSource, TDest>调用)在每个 AppDomain 生命周期中完成一次,理想情况下是在Profile.

因此,让我们考虑一下 RESTful 术语中控制器操作中的几个典型工作流

GET(以 RDBMS 术语选择):

  1. 控制器查询服务层以检索域模型(大多数情况下为聚合根)
  2. 控制器调用映射层将域模型映射到视图模型
  3. 控制器将视图模型传递给视图

PUT(以 RDBMS 术语插入):

  1. 控制器从视图接收视图模型作为动作参数
  2. 控制器将视图模型映射到域模型
  3. 控制器将领域模型传递给服务层进行处理
  4. 控制器重定向到 GET 操作

DELETE(在 RDBMS 术语中删除)

  1. 控制器接收一个 id 作为动作参数
  2. 控制器将id传递给服务层进行处理(删除)
  3. 控制器重定向到 GET 操作

POST(RDBMS 术语中的更新):

  1. 控制器从视图接收视图模型作为动作参数
  2. 控制器使用视图模型中包含的唯一 ID 查询服务层以获取我们想要更新的域模型
  3. 控制器仅更新检索到的域模型的属性,这些属性也存在于视图模型中。例如,域模型可能包含一个用户名和 IsAdmin 属性,而视图模型显然只包含一个用户名属性。因此,我们保持域模型上的 IsAdmin 属性不变,并更新 Username 属性。在 AutoMapper 术语中,这转换为.Map<TSource, TDest>方法的以下 void 重载:Mapper.Map<ADomain, ViewModel>(domainInstanceControllerRetrievedUsingTheId, viewModelInstancePassedAsArgument);
  4. 控制器将更新后的域模型传递给服务层进行处理(更新)
  5. 控制器重定向到 GET 操作

有了这 4 个工作流程,您就可以进入 CRUD 世界了。

PS 一个 REST 提醒:

Create = PUT
Retrieve = GET
Update = POST
Delete = DELETE
于 2012-07-16T21:29:41.573 回答