Automapper ForMember MapFrom似乎不起作用

时间:2019-11-14 12:12:45

标签: c# automapper

public class Source
{
    public SourceId Identification { get; }
}

public class SourceId 
{
    public string Id { get; }
}

public class Destination
{
    public string Identification { get; set; }
}

public class SourceProfile : Profile
{
    public SourceProfile()
    {
        CreateMap<Source, Destination>().ForMember(dest => dest.Identification, opt => opt.MapFrom(src => src.Identification.Id));
    }
}
---------------------------------------------------------------------

// On startup of the application

var config = new MapperConfiguration(cfg => cfg.AddProfile<SourceProfile>());
var mapper = config.CreateMapper();

---------------------------------------------------------------------

// The mapper is injected into the class where the following code is used
var dest = mapper.Map<Source, Destination>(source);
var destId = dest.Identification;

destId的值为“ Source.SourceId”。基本上是SourceId对象的ToString()表示形式。映射器由于某种原因未考虑单个成员映射。

2 个答案:

答案 0 :(得分:1)

在启动时,您将需要注册配置文件本身,建议您注册Startup类,这样它将在整个项目中找到所有从Profile派生的内容,如下所示:

services.AddAutoMapper(typeof(Startup));

然后,您不需要映射器配置。除非您有需要的利基场景。

仅在其他信息部分,您也可以像这样调用映射器:

mapper.Map<Destination>(source)

因为它将选择源的类型(除非您具有多态性,所以您的类型不同)。

答案 1 :(得分:0)

我实际上最终删除了自定义成员映射,并从源复杂类型向字符串添加了显式映射。

// old
CreateMap<Source, Destination>().ForMember(dest => dest.Identification, opt => opt.MapFrom(src => src.Identification.Id));

// new
CreateMap<SourceId, string>().ConvertUsing(source => source.Id);
CreateMap<Source, Destination>();

我不确定我的初次尝试中缺少什么,但这似乎可以解决问题。