我正在使用 AutoMapper (v6.1.1)将一些实体对象映射到将由 Web Api REST Web服务返回的DTO对象 .NET 4.6.2 。
现在我手动设置我的映射:
Mapper.Initialize((config) =>
{
config.CreateMap<SignBook, sdk.SignBook>()
.ForMember(dto => dto.DocumentId, conf => conf.MapFrom(obj => obj.Document.Id))
.ForMember(dto => dto.UserId, conf => conf.MapFrom(obj => obj.User.Id))
.ForMember(dto => dto.DeviceId, conf => conf.MapFrom(obj => obj.Device.Id))
.ForMember(dto => dto.SignTypeId, conf => conf.MapFrom(obj => obj.SignType.Id))
.ForMember(dto => dto.StateId, conf => conf.MapFrom(obj => obj.State.Id))
.ReverseMap();
});
但是,正如您所看到的,DTO对象的所有属性都被命名为实体名称+“Id”后缀(例如:Document.Id
在实体中{{1}在DTO)。
由于我要映射许多实体,因此我想为AutoMapper创建一个映射规则(因此创建一个自定义解析器),它将自动执行此操作。 有可能吗?
当您需要做类似的事情时,是否还有一些最佳做法?所以我想要做的是将实体对象映射到DTO对象。我的实体是NHibernate对象,彼此之间有许多相互作用,并且还使用了延迟加载,因此我无法将它们直接推回到Web Api方法结果中进行序列化。
答案 0 :(得分:2)
AutoMapper默认支持Flattening。您只需要简单的映射:
Mapper.Initialize(config =>
{
config.CreateMap<SignBook, sdk.SignBook>().ReverseMap();
});
并且也支持从AutoMapper 6.1 Unflattening开始。
压扁:
var entity = new SignBook { new Document { Id = 42 } };
var dto = Mapper.Map<sdk.SignBook>(entity);
给你
{
"DocumentId": 42
}
Unflattening:
var dto = new sdk.SignBook { DocumentId = 42 };
var entity = Mapper.Map<SignBook>(dto);
给出
{
"Document": {
"Id": 42
}
}