C#基于属性名称的AutoMapper自定义解析器

3
我正在使用 AutoMapper (v6.1.1) 将一些实体对象映射为DTO对象,并将其返回给基于 Web Api 的REST Web服务,在 .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到DTO中的DocumentId)。

由于我有许多实体要映射,我想为AutoMapper创建一个映射规则(因此创建自定义解析器),可以自动执行此操作。是否有可能做到这一点?

在需要执行此类操作时,是否还有一些最佳实践?因此,我想将实体对象映射到DTO对象。我的实体是具有许多相互关系并且还使用延迟加载的NHibernate对象,因此无法直接将它们推回Web Api方法结果进行序列化。

1个回答

2
AutoMapper默认支持Flattening。您只需要进行简单的映射:
Mapper.Initialize(config =>
{
    config.CreateMap<SignBook, sdk.SignBook>().ReverseMap();
});

从AutoMapper 6.1开始,也支持取消扁平化

平铺:

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
  }
} 

1
我真的不知道它是如此简单的! - Cheshire Cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接