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

时间:2012-07-16 21:27:57

标签: asp.net-mvc asp.net-mvc-3 automapper

我的mvc3项目有以下图层。

控制器 - >服务 - >库中。

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

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

谢谢。

1 个答案:

答案 0 :(得分:10)

  

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

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

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

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

GET(以RDBMS术语表示):

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

    1. controller从视图中接收视图模型作为操作参数
    2. controller将视图模型映射到域模型
    3. controller将域模型传递给服务层进行处理
    4. 控制器重定向到GET操作
    5. DELETE(以RDBMS术语删除)

      1. controller接收id作为操作参数
      2. controller将id传递给服务层进行处理(删除)
      3. 控制器重定向到GET操作
      4. POST(以RDBMS术语更新):

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

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

          P.S。 REST提醒:

          Create = PUT
          Retrieve = GET
          Update = POST
          Delete = DELETE