使用Automapper的IValueConverter的问题



我有点不知道如何实现映射。我会尽力描述一下情况。我正在从ParcelRequestDTO映射到NParcel。这两个类都有:

public class ParcelRequestDTO
{
public decimal Length { get; set; }
public decimal Width { get; set; }
public decimal Height { get; set; }
public string DistanceUnit { get; set; }
public decimal Weight { get; set; }
public string MassUnit { get; set; }
public string Metadata { get; set; }
}
public partial class NParcel
{
public int Id { get; set; }
public decimal? Length { get; set; }
public decimal? Width { get; set; }
public decimal? Height { get; set; }
public int? DistanceUnitId { get; set; }
public decimal Weight { get; set; }
public int? MassUnitId { get; set; }
}

NParcel实际上是EF实体的一部分。DistanceUnitId和MassUnitId是外键,因此它们的值可以为null或必须是对主键的引用。

因此,在我的DTO中,我接收MassUnit作为字符串,例如";lb"oz"gr"K";,等等。我需要在适当的表中找到这些标签中任何一个的对应id。所以我正在尝试实现一个值转换器:

public class ResolveMassUnits : IValueConverter<string, int>
{
private readonly IMassUnitsService _massUnitsService;
public ResolveMassUnits(IMassUnitsService massUnitsService)
{
_massUnitsService = massUnitsService;
}
public int Convert(string sourceMember, ResolutionContext context)
{
int? retVal = _massUnitsService.GetIdByName(sourceMember);
if (retVal == null)
{
retVal = _massUnitsService.GetIdByName("lb");
}
return (int)retVal;
}
}

正如你所看到的,我正在尝试注入(.NET Core 3依赖注入模型(来实例化ResolveMassUnits类(我不确定我做得是否正确,所以如果你在这里看到问题,请给出建议(。

然而,我最初的问题是,当我尝试设置映射时,会出现编译错误。这就是我正在做的:

public class RequestsProfile : Profile
{
public RequestsProfile()
{
CreateMap<ParcelRequestDTO, NParcel>()
.ForMember(dest => dest.ParcelState, opt => opt.Ignore())
.ForMember(dest => dest.DistanceUnit, opt => opt.Ignore())
.ForMember(dest => dest.MassUnitId, opt => opt.ConvertUsing<ResolveMassUnits, string>(src => src.MassUnit))
.ForMember(dest => dest.ParcelTemplate, opt => opt.Ignore())
;
}  
}

当我编译时,我会得到以下错误:

严重性代码描述项目文件行禁止显示状态错误CS0311不能将类型"Test.Extneneneba API.MMappings.ResolveMassUnits"用作泛型类型或方法"IMemberConfigurationExpression<"中的类型参数"TValueConverter";ParcelRequestDTO,NParcel,对象>。转换器使用<TValueConverter,TSourceMember>(表达式<函数<ParcelRequestDTO,TSourceMember>>('。没有从"Test.Leforming.Mappings.ResolveMassUnits"到"AutoMapper.IValueConverter<字符串,对象>'。Test.API C:\Projects\Test\Repo\src\IO.Swagger\Mappings\RequestsProfile.cs 146活动错误CS0246找不到类型或命名空间名称"ResolveMassUnits"(是否缺少using指令或程序集引用?(CoreAPIServiceTesting C:\Projects\Test\Repo\src\IO.Swagger\MMappings\RequestsProfile.cs 146 Active

很明显,它找不到ResolveMassUnits。

有人知道我做错了什么吗?我试着用几种不同的方式来解决这个问题,但为了我自己,我找不到一种方法来正确地进行映射。

提前谢谢。

初始化Automapper时,使用指定服务容器

Mapper.Initialize(map =>
{
map.ConstructServicesUsing(ObjectFactory.GetInstance);
});

最新更新