【问题标题】:Mapping from Entity Type to DTO in API applicationAPI 应用程序中从实体类型到 DTO 的映射
【发布时间】:2014-11-02 03:10:12
【问题描述】:

我有一个 WebAPI 应用程序,我必须从实体对象映射到 DTO 以满足 API 响应的外观。对于实体类型和 DTO 之间的这种映射,我使用AutoMapper,如下所示:

Mapper.CreateMap<CustomerEntity, CustomerDTO>()
.ForMember(dest => dest.Age, opts => opts.Ignore())
.ForMember(dest => dest.Name, opts => opts.MapFrom(src => src.CustomerName));

然后使用其中一个操作中的一行,我可以返回所需的 JSON 格式和适当的属性名称:

public CustomerDTO GetCustomer(int Id)
{
   return Mapper.Map<CustomerEntity, CustomerDTO>(db.Customer.Find(id));
}

但正因为如此,我必须创建许多类型 (DTO),我宁愿只给我一个 anonymous 或 dynamic 结果,因为无论如何它都会以 JSON 的形式返回,我不使用这些其他任何类型的类型。

我也可以做如下投影:

public CustomerDTO GetCustomer(int Id)
{
   var customer = db.Customer.Find(id));
   return new CustomerDTO{ Name = customer.CustomerName, OtherProperty = "others" };
}

但是我将不得不手动重复代码,我也会错过上面 AutoMapper 的映射配置功能。

本质上真正有用的是下面的内容:

Mapper.CreateMap<CustomerEntity, dynamic>()
.ForMember("Age", opts => opts.Ignore())
.ForMember("Name", opts => opts.MapFrom(src => src.CustomerName));

但这是不可能的。这更像是一个概念问题而不是具体问题,所以请帮助我理解我如何防止在 API 应用程序中创建 DTO 以适应响应结构 (JSON) 和实体对象之间的差异甚至是一种选择。也欢迎任何其他建议。

【问题讨论】:

  • 您是否在代码生成 DTO?
  • @RobertHarvey 没有。像 POCO 一样手动创建它们。
  • @RobertHarvey 你说的代码生成是什么意思?
  • 那么您打算如何生成 JSON? JSON 生成代码如何知道要包含/排除哪些成员? DTO 的全部意义在于履行这一角色,即数据传输对象。
  • @JimmyBogard 但是就 AutoMapper 而言,我上面想象的想法是否过于牵强?我只是想要一种减少 DTO 数量的方法,同时又不会失去 AutoMapper 的优势。但话说回来,这又是一个概念性问题。非常感谢您的意见。

标签: c# json asp.net-web-api mapping automapper


【解决方案1】:

您可以使用NewtonSoft's Json serializer 并标记您不想使用[JsonIgnore] 映射的实体类的属性。不再需要 DTO,无论是动态的还是其他的。

【讨论】:

  • 谢谢。这负责 AutoMapper 的 Ignore() 部分,但 MapFrom() 呢?这些是我最常使用的 2 个。
  • 使用 JsonPropertyAttribute 及其 PropertyName。
【解决方案2】:

我不知道如何继续使用 Automapper 并执行此操作。但是,您可以使用匿名类型并使 WebApi 方法返回 IHttpActionResult。

public CustomerDTO GetCustomer(int Id)
{
   var customer = db.Customer.Find(id));
   return new CustomerDTO{ Name = customer.CustomerName, OtherProperty = "others" };
}

会变成

public IHttpActionResult GetCustomer(int Id)
{
   var customer = db.Customer.Find(id));
   return Ok(new { Name = customer.CustomerName, OtherProperty = "others" });
}

WebApi 中的 JSON 或 XML 序列化程序会负责创建正确的序列化,您的客户端应该会收到相同的输出。

上面的输出将与下面类似。

HTTP/1.1 200 OK
Content-Length: 47
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?SjpcQ29kZVxTb3VyY2VcVmFuZ3VhcmRcVk5HIEFQSVxQT0NzXFBhZ2luZ1BPQ1xNZW1iZXJz?=
X-Powered-By: ASP.NET
Date: Mon, 08 Sep 2014 21:20:57 GMT

{"Name":"John Robers","OtherProperty":"others"}

网上有几篇关于新 IHttpActionResult 的好文章,我觉得其中一篇很有用。它还概述了其他一些新的 WebApi 2 功能。

http://bitoftech.net/2014/03/05/new-asp-net-web-api-2-ihttpactionresult-cors-tutorial/

【讨论】:

  • 同样的东西有投影,我必须在所有适用的地方重复相同的代码。
猜你喜欢
  • 2018-09-13
  • 2017-09-17
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多