20

使用Automapper我创建了一个简单的地图:

Mapper.CreateMap<MyCustomerDTO, YourCustomerDTO>()

我也经常需要另辟蹊径。我是否还需要以其他方式创建映射,还是 Automapper 会根据上述映射推断它?

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

4 回答 4

22

这是我需要以两种方式创建 automapper createmap 的副本吗?

.ReverseMap() 注意这里的答案。

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

于 2012-12-17T17:51:18.210 回答
16

不,您必须创建双向映射。双向映射的一个很好的辅助方法可能是:

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

然后像这样使用它:

ViceVersa<T1, T2>();
于 2012-12-17T17:52:34.560 回答
2

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

于 2012-12-17T17:35:50.303 回答
1

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

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

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

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

于 2017-02-20T16:38:14.397 回答