首页 > 解决方案 > API 请求对象的泛型或继承

问题描述

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

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

有继承:

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 都有单独的请求对象,这样对我来说它看起来更干净,除了与其余代码一致(因为并非所有请求对象都可以通用实施)。此外,如果将来有任何机会需要为请求对象添加特定于类型的属性,那么我们的代码会随着这种变化而更加灵活。

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

标签: c#restdesign-patternsarchitecture

解决方案


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


推荐阅读