AutoMapper:Map <a,b>是否给出<b,a>?</b,a> </a,b>

时间:2012-12-17 17:33:06

标签: asp.net-mvc automapper

使用自动播放器我创建了一个简单的地图:

Mapper.CreateMap<MyCustomerDTO, YourCustomerDTO>()

我经常需要走另一条路。我是否还需要以其他方式创建映射,或者Automapper是否会根据上述映射推断它?

Mapper.CreateMap<YourCustomerDTO, MyCustomerDTO>()   //Needed?

4 个答案:

答案 0 :(得分:16)

这与Do i need to create automapper createmap both ways?

重复

请注意关于.ReverseMap() here的答案。

请注意,.ReverseMap()用于基本映射。如果您需要使用选项(例如特定的ForMember映射),则需要创建自定义反向映射。

答案 1 :(得分:13)

没有。你必须创建双向映射。双向映射的一个好帮手方法可能是:

 protected virtual void ViceVersa<T1, T2>()
        {
            Mapper.CreateMap<T1, T2>();
            Mapper.CreateMap<T2, T1>();
        }

然后像这样使用它:

ViceVersa<T1, T2>();

答案 2 :(得分:2)

您还需要创建第二个映射。尝试在没有第二次映射的情况下运行应用程序的简单测试会给您带来运行时错误

答案 3 :(得分:1)

在使用AutoMapper时我遇到了同样的问题,@ Behnam-Esmaili是一个很好的答案,但可以改进。

您可以为IMapperConfigurationExpression实现一个扩展方法,它将执行双向映射,并期望在尝试为两种类型配置映射时使用两个可选参数(Action<IMappingExpression<T, Y>>)。 / p>

public static class ModelMapper
{
    private static readonly IMapper _mapper;

    static ModelMapper()
    {
        var mapperConfiguration = new MapperConfiguration(config =>
        {
            config.CreateTwoWayMap<CustomerViewModel, Customer>(
                secondExpression: (exp) => exp.ForMember((source) => source.CustomerEmail, opt => opt.MapFrom(src => src.Email)));
        });

        _mapper = mapperConfiguration.CreateMapper();
    }

    public static void CreateTwoWayMap<T, Y>(this IMapperConfigurationExpression config, 
        Action<IMappingExpression<T, Y>> firstExpression = null,
        Action<IMappingExpression<Y, T>> secondExpression = null)
    {
        var mapT = config.CreateMap<T, Y>();
        var mapY = config.CreateMap<Y, T>();

        firstExpression?.Invoke(mapT);
        secondExpression?.Invoke(mapY);
    }

    public static T Map<T>(object model)
    {
        return _mapper.Map<T>(model);
    }
}

上面的实现是实现它的一种方式,但它的设计可能不同。