自动映射器从接口映射到动态,同时根据值决定实现目标

Automapper Map from Interface to dynamic while deciding implementation destination based on value

我正在尝试 select 界面将转换成什么。 所以我的地图设置如下:

    CreateMap<ICustomerServiceDto, dynamic>()
        .ConvertUsing(service => CreateForServices(service));
    CreateMap<ICustomerServiceDto, CustomerServiceTelecomDto>();
    CreateMap<CustomerServiceTelecomDto, CustomerServiceTelecomModel>();

和 CreateForServices

    private ICustomerServiceModel CreateForServices(ICustomerServiceDto type)
    {
        if (type is CustomerServiceTelecomDto telecom)
        {
            //I do not like this solution
            return new CustomerServiceTelecomModel(telecom.Value);
        }


        throw new InvalidOperationException($"Unknown type: {type.GetType().FullName}");
    }

稍后我会添加其他类型进行转换,但上面的方法有效。

但我不想在 CustomerServiceTelecomModel 中填充构造函数,AutoMapper 已经知道如何将 CustomerServiceTelecomDto 映射到 CustomerServiceTelecomModel,所以我可以以某种方式使用该映射吗?

据我所知,这是在映射器配置文件中,我无法访问映射器实例并手动进行映射。

您可以使用 ConvertUsing 的另一个重载,它提供解析上下文和对映射器的引用。

    CreateMap<ICustomerServiceDto, dynamic>()
        .ConvertUsing((service, _, ctx) => CreateForServices(ctx, service));

    private ICustomerServiceModel CreateForServices(ResolutionContext ctx, ICustomerServiceDto type)
    {
        if (type is CustomerServiceTelecomDto telecom)
        {
            return ctx.Mapper.Map<CustomerServiceTelecomModel>(type);
        }


        throw new InvalidOperationException($"Unknown type: {type.GetType().FullName}");
    }