automapper - 使用 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.API.Mappings.ResolveMassUnits”不能用作泛型类型或方法“IMemberConfigurationExpression<ParcelRequestDTO, NParcel, object>.ConvertUsing<TValueConverter, TSourceMember>(表达式<Func<ParcelRequestDTO, TSourceMember>>)'。没有从“Test.API.Mappings.ResolveMassUnits”到“AutoMapper.IValueConverter<string, object>”的隐式引用转换。Test.API C:\Projects\Test\Repo\src\IO.Swagger\Mappings\RequestsProfile.cs 146 活动错误 CS0246 找不到类型或命名空间名称“ResolveMassUnits”(您是否缺少 using 指令或程序集引用?) CoreAPIServiceTesting C:
所以很明显它没有找到 ResolveMassUnits。
有人知道我做错了什么吗?我试图以几种不同的方式解决这个问题,但为了我,我找不到正确进行此映射的方法。
提前致谢。
解决方案
初始化 Automapper 时,使用以下命令指定您的服务容器:
Mapper.Initialize(map =>
{
map.ConstructServicesUsing(ObjectFactory.GetInstance);
});
推荐阅读
- html - 将我的网站布局居中不适用于 margin: auto
- speech-recognition - 检测语音结束 Asterisk 13
- docker - Docker - 使用 docker-compose 挂载主机卷的 nginx 挂起
- python - 将 Python 2.7 更新到 Python 3 后,Sublime 将无法识别以前导入的模块
- java - Springboot 单元测试动态设置@Configuration Properties
- c# - 如何从多个类c#返回
- javascript - 如何在 Electron js 中将消息打印到 openDevTools 的控制台?
- sql-server - SQL 查询 - 值不能与前一行相同
- c# - 是否有 .NET Framework 4.7.x(非核心)的示例显示如何将简单的(键、值)缓存存储在 Oracle 中?
- hadoop - 如何检查配置单元中的第一个非空值