【发布时间】: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