【问题标题】:Generics or Inheritance for API request objectAPI 请求对象的泛型或继承
【发布时间】:2020-04-23 23:21:54
【问题描述】:

我知道这可能是一个基于意见的问题,但是,我想问一下,因为这可能有一些设计原则。

我有一个 .net C# Web API 应用程序来公开几个 API 来从数据库中检索一些数据。我也在这个项目上使用了 mediateR。 API,它们都获得一个请求对象,但它们都具有完全相同的属性。想象一下,我们有一个 BaseProduct 类,ProductAProductBProductC 已在 domain 项目中继承。现在,我需要公开 API 以将这三个对象返回给用户。这是两个请求对象的示例。

继承:

public abstract class BaseGetProductRequest { // the props here }
public class GetProductARequest : BaseGetProductRequest, IRequest<GetProductAResponse> { }
public class GetProductBRequest : BaseGetProductRequest, IRequest<GetProductBResponse> { }

public class GetProductAResponse { public ProductA[] Products {get; set;} }

上述每个请求也都有自己的请求处理程序类。

使用泛型:(BaseProduct 是一个域对象类,从中继承了不同的产品类型)

public class GetProductRequest<TProductType> : IRequest<TProductType[]> where TProductType : BaseProductType { // all props in here }

将在 API 中像这样使用:

public async Task<ProductA[]> Get([FromRoute] GetProductRequest<ProductA> request) { // API body }

所以,问题是:从设计的角度来看,以下哪种方法更适合?

  1. 采用上述继承方式
  2. 或者使用泛型实现请求和请求处理程序,这样我们最终会得到更少的文件

就个人而言,我更喜欢第一种方法,因为我希望每个 API 都有单独的请求对象,这样对我来说它看起来更干净,除了与其余代码一致(因为不是所有的请求对象可以通用地实现)。此外,如果将来有任何机会需要为请求对象添加特定于类型的属性,那么我们的代码会随着这种变化而更加灵活。

是否有任何具体的设计指南建议例如接管另一个?提前感谢您的意见。

【问题讨论】:

  • 能否分享GetProductAResponseGetProductBResponse 样品?它们是否以某种方式与泛型变体中的ProductType[] 相关?
  • 是的,它现在已共享 - 目前响应将是域对象的数组

标签: c# rest design-patterns architecture


【解决方案1】:

由于已编译请求的可重用性,继承方法肯定会给您的项目带来更高的性能

【讨论】:

  • 这应该被视为评论,而不是答案
猜你喜欢
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2012-07-08
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多