【发布时间】:2020-04-23 23:21:54
【问题描述】:
我知道这可能是一个基于意见的问题,但是,我想问一下,因为这可能有一些设计原则。
我有一个 .net C# Web API 应用程序来公开几个 API 来从数据库中检索一些数据。我也在这个项目上使用了 mediateR。 API,它们都获得一个请求对象,但它们都具有完全相同的属性。想象一下,我们有一个 BaseProduct 类,ProductA、ProductB 和 ProductC 已在 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 }
所以,问题是:从设计的角度来看,以下哪种方法更适合?
- 采用上述继承方式
- 或者使用泛型实现请求和请求处理程序,这样我们最终会得到更少的文件
就个人而言,我更喜欢第一种方法,因为我希望每个 API 都有单独的请求对象,这样对我来说它看起来更干净,除了与其余代码一致(因为不是所有的请求对象可以通用地实现)。此外,如果将来有任何机会需要为请求对象添加特定于类型的属性,那么我们的代码会随着这种变化而更加灵活。
是否有任何具体的设计指南建议例如接管另一个?提前感谢您的意见。
【问题讨论】:
-
能否分享
GetProductAResponse或GetProductBResponse样品?它们是否以某种方式与泛型变体中的ProductType[]相关? -
是的,它现在已共享 - 目前响应将是域对象的数组
标签: c# rest design-patterns architecture