自动映射器从接口映射到动态,同时根据值决定实现目标
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}");
}
我正在尝试 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}");
}