其他分享
首页 > 其他分享> > CodeGo.net> Automapper-如何从源子对象映射到目标

CodeGo.net> Automapper-如何从源子对象映射到目标

作者:互联网

我正在尝试从源的子对象映射到目标(作为父对象).

源模型:

public class SourceBaseResponse<T> where T : new()
{
    public string Type { get; set; }

    public string Id { get; set; }

    public T Attributes { get; set; }
}

对于我的示例,我正在使用T为SourceAssignment类型

 public class SourceAssignment
{
    public string Id { get; set; }

    public string Email { get; set; }

    public string EmployeeId { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public DateTimeOffset CreatedAt { get; set; }

}

目标对象

public class DestinationAssignment
{
    public string Id { get; set; }

    public string Email { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

我想将源模型直接映射到目标.所以,我试图使用

CreateMap<SourceAssignment, DestinationAssignment>();
CreateMap<SourceBaseResponse<SourceAssignment>, DestinationAssignment>()
            .ForMember(dest => dest, opt => opt.MapFrom(src => AutoMapperConfig.Mapper.Map<DestinationAssignment>(src.Attributes)));

这行不通,因为我在上面的行中遇到运行时错误,即“类型的顶级单个成员仅支持成员的自定义配置”.

因此,按照this thread,我尝试了以下操作

CreateMap<SourceBaseResponse<SourceAssignment>, DestinationAssignment>()
            .AfterMap((src, dst) => Mapper.Map(src.Attributes, dst));

现在,我在应该进行映射的地方出现错误,提示“未初始化映射器.使用适当的配置调用初始化.如果您试图通过容器或其他方式使用映射器实例,请确保您没有对静态映射器的任何调用.地图方法,如果使用的是ProjectTo或UseAsDataSource扩展方法,请确保传递适当的IConfigurationProvider实例.”

我能够为每个属性使用ForMember并将其从src.Attributes映射到dest(例如:src.Attribute.Id到dest.Id).这行得通,但是我并不是真的想要这样做,因为我的Source是涉及嵌套子级的复杂类(因为这是Web API响应,因此我无法对此进行控制).因此,这里完成了许多自定义映射

CreateMap<SourceAssignment, DestinationAssignment>();

有关如何进行的任何建议.

解决方法:

需要解析上下文才能调用Mapper.Map(),您可以使用ConstructUsing()获取解析上下文:

CreateMap<SourceChild, Destination>();
CreateMap<Source, Destination>()
    .ConstructUsing((src, ctx) => ctx.Mapper.Map<Destination>(src.SourceChild));

标签:automapper,automapper-5,c
来源: https://codeday.me/bug/20191026/1935312.html