automapper,您将代码放在哪里将View Model映射到Entity

qin*_*126 6 asp.net-mvc automapper asp.net-mvc-3

我的mvc3项目有以下图层.

controller - > service - > repository.

我需要将ViewModel映射到Entity,不确定哪个层是放入代码的正确层.

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

谢谢.

Dar*_*rov 10

我需要将ViewModel映射到Entity,不确定哪个层是放入代码的正确层.

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

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

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

GET (以RDBMS术语表示):

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

PUT (以RDBMS术语插入):

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

DELETE (以RDBMS术语删除)

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

POST (以RDBMS术语更新):

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

有了这4个工作流程,您就可以为CRUD世界做好准备了.

PS一个REST提醒:

Create = PUT
Retrieve = GET
Update = POST
Delete = DELETE
Run Code Online (Sandbox Code Playgroud)