AutoMapper:一个源对象映射到多个目标对象

4

我有一个定义为以下内容的源模型

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

我希望将源根目录SourceRoot映射到目标根目录DestinationRoot,并从源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`的值为空。需要注意的是,我正在使用AutoMapper的4.2版本,其中静态方法已被弃用,因此需要避免使用。通常我会这样做:
Mapper.CreateMap<SourceRoot, DestinationRoot>()
            .ForMember(d => d.ContributesTo, opt => opt.MapFrom( s=> Mapper.Map<ContributesTo>(s.Organisation)));

但是现在不建议使用静态方法。有其他的方法可以实现这个吗?
谢谢
1个回答

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会发现源和目标根都具有属性“Organization”,它只映射此属性。 Automapper无法理解它应该使用源的一个属性来映射目标的多个属性(这些属性按名称不匹配)。请注意,您不需要为“Organization”成员指定映射,因为它与目标对象中的属性名称匹配。

3
这是一种你过于努力地寻找解决方案的情况(就像我试图为它制作地图那样),而答案真的很简单!谢谢! - ADringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接