Веб-API различных комбинаций полей на одной модели - PullRequest
1 голос
/ 01 ноября 2019

Скажем, у меня есть следующая модель:

class Product
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Brand { get; set; }
    public string Description { get; set; }
    public string Image { get; set; }
}

Для просмотра списка в клиенте мне понадобится только следующее:

class ProductListView
{
    public string Name { get; set; }
    public string Image { get; set; }
}

Для подробного просмотра мне понадобитсяследующее:

class ProductDetailView
{
    public string Name { get; set; }
    public string Brand { get; set; }
    public string Description { get; set; }
    public string Image { get; set; }
}

Для обновления имени мне потребуется:

class ProductUpdateName
{
    public string Id { get; set; }
    public string Name { get; set; }
}

Для обновления описания и бренда мне потребуется:

class ProductUpdateDescriptionAndBrand
{
    public string Id { get; set; }
    public string Brand { get; set; }
    public string Description { get; set; }
}

Для всех этих различных комбинаций я создаю одинаковое количество классов? Хотя это звучит ужасно.

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

Так какой же самый лучший способ?

1 Ответ

1 голос
/ 01 ноября 2019

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

Теперь, это не мешает вам использовать DTO через наследование. Например, ProductDetailView может наследоваться от ProductListView, поскольку это расширенный набор свойств ProductListView. Однако не следует наследовать от ProductUpdateDescriptionAndBrand, поскольку оно включает свойство Id, которое ProductDetailView не имеет.

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

public class BrandDescription
{
    public string Brand { get; set; }
    public string Description { get; set; }
}

А затем:

public class ProductUpdateDescriptionAndBrand
{
    public string Id { get; set; }
    public BrandDescription BrandDescription { get; set; }
}

public class ProductDetailView : ProductListView
{
    public BrandDescription BrandDescription { get; set; }
}

В противном случае, просто оставьте классы такими, какие они есть, и используйте их все соответствующим образом. Помните также, что каждый из них служит определенной цели (представляет определенную группу передаваемых данных). Таким образом, свойство типа Description не обязательно означает одно и то же во всех местах. То, что свойства похожи или имеют одинаковые имена, не означает, что они обрабатывают одни и те же концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...