ASP.NET Core API 响应序列化中的 AutoMapper 继承映射问题

问题描述 投票:0回答:1

我目前正在开发一个 ASP.NET Core API 项目,其中使用 AutoMapper 将域实体映射到显示模型。我有一个场景,我在域实体上使用继承,并使用 Include 方法设置映射来处理继承。

我有一个自定义 Response 类来处理 API 响应,并且我注意到响应中派生视图模型的序列化存在问题。即使我返回派生视图模型的列表(例如 GetAllMultipleChoiceQuestionViewModel),序列化响应仅包含基本视图模型 (BaseGetAllQuestionViewModel) 中的属性。

这是我的代码的简化版本:

型号:

  • 问题(基类)
  • 多项选择题(源自问题)
  • 选择

查看型号:

  • BaseGetAllQuestionViewModel
  • 获取所有MultipleChoiceQuestionViewModel

自动映射器简介:

CreateMap<Question, BaseGetAllQuestionViewModel>()
    .Include<MultipleChoiceQuestion, GetAllMultipleChoiceQuestionViewModel>();

CreateMap<MultipleChoiceQuestion, GetAllMultipleChoiceQuestionViewModel>()
    .ForMember(dest => dest.Choices, opt => opt.MapFrom(src => src.Choices));

查询处理程序:

public async Task<Response<IEnumerable<BaseGetAllQuestionViewModel>>> Handle(GetAllQuestionsBySurveyContentIdQuery request, CancellationToken cancellationToken)
{
    var questions = await _questionRepositoryAsync.GetAllQuestionsBySurveyContentIdAsync(request.SurveyContentId);
    var questionViewModels = questions.ToList(); // Ensure it's a concrete list

    var response = new Response<IEnumerable<BaseGetAllQuestionViewModel>>(questionViewModels);
    return response;
}

控制器:

 [HttpGet("GetAllQuestionsBySurveyContentId")]
// [Authorize(Roles = "SuperAdmin")]
 public async Task<IActionResult> GetAllQuestionsBySurveyContentId([FromQuery] GetAllQuestionsBySurveyContentIdQuery query)
 {
     var response = await Mediator.Send(query);
     return Ok(response);
 }

我已经确认

_questionRepositoryAsync.GetAllQuestionsBySurveyContentIdAsync
方法以及控制器中的响应正在返回正确的派生视图模型。但是
return Ok(response);
当线路运行时,它会重定向到我的 Response 类,并且仅将响应作为基本视图模型返回。

这是执行返回行之前控制器中的响应:

c# asp.net-core inheritance serialization automapper
1个回答
0
投票

多态类型层次结构序列化是通过 System.Text.Json 选择加入的。例如

[JsonDerivedType(typeof(WeatherForecastWithCity))]
public class WeatherForecastBase
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public string? Summary { get; set; }
}
public class WeatherForecastWithCity : WeatherForecastBase
{
    public string? City { get; set; }
}

https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/polymorphism?pivots=dotnet-7-0

© www.soinside.com 2019 - 2024. All rights reserved.