Asp.Net 核心反序列化接口类型

Asp.Net Core Deserialize Interface Type

我正在开发一个 Asp.Net 核心应用程序,我在其中定义了一个服务,负责将请求存储到 SQL 数据库中。我的请求包含三个属性 Id、RequestType 和一个 SpecificRequestDto。 RequestType 是一个枚举,指定它是航班预订请求、酒店预订请求还是铁路预订请求。例如,SpecificRequestDto 可以是 FlightBookingRequest、HotelBookingRequest、RailBookingRequest。 我的要求class

public class Request
{
  public int RequestId{ get; set; }
  public RequestType RequestType{ get; set; }
  public IRequestDto RequestDto{ get; set; }
}
public class FlightBookingRequestDto : IRequestDto
{
 
}
public class HotelBookingRequestDto : IRequestDto
{

}
public class RailBookingRequestDto: IRequestDto
{

}

我的请求 JSON 可以是 RequestDto 属性 中的 FlightBookingRequestDto、HotelBookingRequestDto 或 RailBookingRequestDto。 现在我的应用程序无法确定 RequestDto 的类型,因为我正在发送接口类型,因此无法反序列化。我已将 RequestDto 作为字符串 属性 并将 FlightBookingRequestDto、HotelBookingRequestDto 或 RailBookingRequestDto 作为 Json 字符串发送,并根据 RequestType 在我的应用程序中对其进行反序列化。

我想知道这是正确的方法还是 Asp.Net core 有更好的解决方案。我目前正在使用 AspNet Boilerplate 模板。

有使用接口的时间和地点,DTO 对象不是一个好的用例。

您的 DTO 应该服务于一个目的:从 A 点到 B 点(然后返回)跨越技术不可知的边界获取数据。一旦 DTO 实现了该目的,就应根据需要将数据映射到更多与技术相关的结构中,这些结构可能包括行为(方法)。

如果您使用的是接口,这表明您的 DTO 具有行为(方法)和数据。这不是个好主意。

最终,可实现接口的主要用例是提供一组通用方法,这些方法可以由该接口的各种实现者以不同方式实现。如果您的 DTO 只是没有功能的数据(它们应该是 - 它们是数据传输对象),那么具有属性(而不是使用接口)的单个 class 应该可以完成这项工作。

以下问题编辑

看起来你的所有请求都非常相似(最好看看你的 IRequestDto 接口来确认),但根据我所看到的,我会推荐:

创建预订请求class:

public class BookingRequest
{
    public int RequestId { get; set; }
    public RequestType RequestType { get; set; }
    // and some assumptions about your IRequestDto interface ...
    public DateTime BookingTime { get; set; }
    public string RequestorName { get; set; }
    public string RequestorEmail { get; set; }
    // ... etc.
}

那么你的服务

public async Task<ActionResult<BookingConfirmation>> RequestBooking(
    BookingRequest request)
{
    // Do common stuff
    // Check request.RequestType to do specific stuff
}

或者,如果您的不同请求差异很大,则为每个创建一个专用的服务方法,每个都有自己的请求class。

但是,一定要摆脱那个 IRequestDto。那会让你痛苦。如果您真的想共享请求的元素,那么创建一个基础 class 请求并从中继承,但是让您的服务请求专注于从该基础 class 派生的每个特定请求 class。