Обобщения или наследование для объекта запроса API - PullRequest
0 голосов
/ 06 января 2020

Я знаю, что это может быть вопрос, основанный на мнении, но я бы предпочел спросить, поскольку для этого может быть какой-то принцип проектирования.

У меня есть приложение веб-API. net C#, которое предоставляет несколько 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 }

Итак, вопрос в том, какой из следующих вариантов будет лучше использовать с точки зрения проектирования?

  1. Чтобы использовать подход наследования, как указано выше
  2. Или реализовать запросы и обработчики запросов с использованием обобщений, чтобы в итоге мы получили меньше файлов

Лично я предпочел бы первый подход, поскольку я хочу буквально иметь отдельные объекты запроса для каждого API, таким образом, для меня это выглядит чище, кроме того, что это будет соответствовать остальной части кода (поскольку не все объекты запроса могут быть реализованы в общем). Кроме того, если по какой-либо причине в будущем возникнет необходимость добавить свойство c с указанием типа для объекта запроса, тогда наш код будет более гибким с этим изменением.

Есть ли что-то подобное Speci c руководящие принципы проектирования, которые рекомендуют, например, взять один за другим? Спасибо за ваши мнения заранее.

1 Ответ

0 голосов
/ 06 января 2020

Конечно, подход наследования даст вашему проекту более высокую производительность из-за возможности повторного использования скомпилированных запросов

...