[英]Mapping from Entity Type to DTO in API application
我有一个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)和实体对象之间的差异,假设这甚至是一个选项。 任何其他建议也受到欢迎。
您可以使用NewtonSoft的Json序列化程序,并使用[JsonIgnore]标记您不希望映射的Entity类的属性。 不再需要DTO,动态或其他。
我不知道如何继续使用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/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.