Automapper-如何从源子对象映射到目标



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

来源模型:

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

在我的例子中,我使用的是SourceAssignment 类型的T

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)));

这不起作用,因为我在上面的一行中得到了运行时错误,即"成员的自定义配置只支持类型上的顶级单个成员。">

因此,根据这个线程,我尝试了以下

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

现在,我在映射应该发生的地方出错,上面写着映射器未初始化。使用适当的配置调用Initialize。如果您试图通过容器或其他方式使用映射器实例,请确保没有对静态映射器.Map方法的任何调用,如果您使用ProjectTo或UseAsDataSource扩展方法,请确保传入适当的IConfigurationProvider实例。

我可以为每个属性使用ForMember,并从src映射它。dest的属性(例如:src.Attribute.Id to 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));

最新更新