AutoMapper将一个源对象转换为多个目标对象

时间:2016-02-12 10:29:51

标签: c# automapper

我有一个定义为

的源模型
public class SourceRoot
{
    ...
    public Organisation Organisation { get; set; }
    ...
}

public class Organisation
{
    public long? Id { get; set; }
    public string Name { get; set; }    
    public string Currency { get; set; }   
    public double SupplementaryAmount { get; set; }
    public decimal BaseConversionRate { get; set; }
}

和目的地定义为:

public class DestinationRoot
{
    ...
    public Organisation Organisation { get; set; }
    public ContributesTo ContributesTo { get; set; }
}

public class Organisation
{
    public long? Id { get; set; }
    public string Name { get; set; }        
}

public class ContributesTo
{
    public string Currency { get; set; }
    public double SupplementaryAmount { get; set; }
    public decimal BaseConversionRate { get; set; }
}

我想从SourceRootDestinationRoot添加副本从源Organisation映射到目标OrganisationContributesTo

我对AutoMapper有以下配置:

public static class AutoMapperConfig
{
    public static MapperConfiguration RegisterMappings()
    {
        var config = new MapperConfiguration(cfg => 
            {   
                cfg.AddProfile<MyProfile>();
            });

        return config;
    }
}

public class MyProfile : Profile
{
    protected override void Configure()
    {
        this.CreateMap<SourceRoot, DestinationRoot>();        
        this.CreateMap<Source.Organisation, Destination.Organisation>();
        this.CreateMap<Source.Organisation, Destination.ContributesTo>();
    }
}

使用此当前配置文件,Organisation会被映射,但ContributesTo会显示为null。 请注意,我使用的是AutoMapper的4.2版本,其中静态方法已被弃用,因此试图避开它。通常我会这样做:

Mapper.CreateMap<SourceRoot, DestinationRoot>()
            .ForMember(d => d.ContributesTo, opt => opt.MapFrom( s=> Mapper.Map<ContributesTo>(s.Organisation)));

但不建议这样做(引用静态方法)。有没有其他方法可以做到这一点?

由于

1 个答案:

答案 0 :(得分:2)

只需添加ContributesTo目标成员的映射:

protected override void Configure ()
{
    CreateMap<Source.SourceRoot, Destination.DestinationRoot>()
        .ForMember(d => d.ContributesTo, opt => opt.MapFrom(s => s.Organisation));

    CreateMap<Source.Organisation, Destination.Organisation>();
    CreateMap<Source.Organisation, Destination.ContributesTo>();
}

否则,Automapper会发现source和destinaton根都具有属性Organisation,并且它仅映射此属性。 Automapper无法理解它应该使用source的一个属性来映射目标的几个属性(名称不匹配)。请注意,您不需要为Organisation成员指定映射,因为它与目标对象中的属性名称匹配。