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()表示形式。映射器由于某种原因未考虑单个成员映射。
答案 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>();
我不确定我的初次尝试中缺少什么,但这似乎可以解决问题。