繁体   English   中英

Automapper-如何将两个复杂的集合映射到一个目标集合对象

[英]Automapper - how to map two complex collections to one destination collection object

我有两个不同的对象,想将它们映射到一个目标对象。 源对象是包含多个子对象的复杂对象,这些子对象也需要进行映射。 我尝试了类似于以下示例的操作,但是正如预期的那样,最后一个映射将覆盖以前的任何映射。

CreateMap<sourceObject, destinationObject>()
.ForMember(d => d.Addresses, o => o.MapFrom(s => s.Addresses.MainAddresses))
.ForMember(d => d.Addresses, o => o.MapFrom(s => s.Addresses.SomeOtherAddresses))

我想我正在寻找类似MapFrom().AndThenMapFrom()方法( MapFrom().AndThenMapFrom()或联合类型转换)的东西。

我使用了一个自定义值解析器来解决此问题,但是在我看来这似乎无法实现自动映射器的目的。 任何其他建议将受到欢迎。

如果要在“地址”中连接映射结果(“主地址”到“地址”和“其他地址”到“地址”),一种解决方案是

CreateMap<sourceObject, destinationObject>()
    .ForMember(
        d => d.Addresses,
        o => o.MapFrom(
            s => s.Addresses.MainAddresses
                .Cast<object>()
                .Concat(s.Addresses.SomeOtherAddresses)))

要么

CreateMap<sourceObject, destinationObject>()
    .ForMember(
        d => d.Addresses,
        o => o.MapFrom(
            s => s.Addresses.MainAddresses
                .Cast<IAddress>()
                .Concat(s.Addresses.SomeOtherAddresses)))

MainAddresses和SomeOtherAddresses中的对象是否实现IAddress接口。

另一个解决方案是在Before / AfterMap方法中执行此操作

CreateMap<sourceObject, destinationObject>()
    .BeforeMap(
        (s, d, c) =>
        {
            var mainAddresses = c.Mapper.Map<IEnumerable<Address>>(s.Addresses.MainAddresses);
            var someOtherAddresses = c.Mapper.Map<IEnumerable<Address>>(s.Addresses.SomeOtherAddresses);

            d.Addresses = mainAddresses
                .Concat(someOtherAddresses)
                .ToArray();
        })
        .ForMember(d => d.Addresses, o => o.Ignore());

在这种情况下,应该忽略地址映射,因为我们在BeforeMap中“手动”完成了映射。 不幸的是,这两种解决方案都不像大多数简单的自动映射器规则那样优雅。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM