Web API: как передавать данные между контроллером и бизнес-логикой - PullRequest
0 голосов
/ 30 апреля 2020

В настоящее время я работаю над решением с этой архитектурой:

  • ApplicationCore проект (содержит доменные сущности и бизнес-логи c)
  • Infrastructure проект ( содержит указанный c код инфраструктуры, такой как Entity Framework)
  • WebAPI проект (REST API для Angular front и других клиентских служб)

Давайте представим веб-форму для создания например, автомобиль с указанием основной информации и деталей, который отправляет в действие контроллера, например:

[HttpPut]
public async Task<IActionResult> Create(CarModel carModel)

, где CarModel:

public class CarModel 
{
  public string Manufacturer { get; set; }
  public string Model { get; set; }
  public IEnumerable<CarPartModel> Parts { get; set; }
}

public class CarPartModel
{
  public string Name { get; set; }
  public IEnumerable<CarPartAttributeModel> Attributes { get; set; }
}

public class CarPartAttributeModel
{
  public string Code { get; set; }
  public object Value { get; set; }
}

Мой бизнес-уровень будет содержать ICarService с методом CreateCar, который проверял бы все вставленные данные, чтобы проверить их и применить некоторые правила. Теперь я не знаю, как правильно передать эту сложную модель из контроллера в мою бизнес-логику c.

Мне пришло в голову два варианта:

  1. To поместите CarModel в мой BLL и просто передайте его методу CreateCar
  2. Чтобы создать аналогичный DTO в BLL и скопируйте CarModel в этот DTO, чтобы модели оставались внутри слоя WebAPI

Что считается приемлемой или лучшей практикой? Есть ли третий вариант?

1 Ответ

1 голос
/ 30 апреля 2020

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

Мой WebAPI взаимодействует только с DTO, поэтому метод Create будет принимать CreateCarDto. В вашем коде я предполагаю, что CarModel является DTO-подобным объектом, а не объектом вашего домена. (примечание: REST обычно использует POST для создания, а не PUT для обновления). Затем мой контроллер вызывает метод Create для моей службы, передавая это DTO в качестве параметра. Затем метод Create службы делает свое дело - валидация (я использую FluentValidation), а затем я сопоставляю свой DTO с объектом домена, прежде чем выполнять работу с БД через EF.

Для описываемой вами установки я не думаю, вам нужно три слоя объектов (модель / DTO / домен?). Обычно общедоступный c материал взаимодействует с Model / DTO, а базовые сервисы переводят объект домена в / из этих DTO.

...