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。
我正在开发一个 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。