我有一个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)和实体对象之间的区别假设是甚至是一个选择。任何其他建议也受到欢迎。
答案 0 :(得分:3)
您可以使用NewtonSoft's Json serializer并标记您不希望使用[JsonIgnore]映射的实体类的属性。不再需要DTO,动态或其他。
答案 1 :(得分:0)
我不知道如何继续使用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/