Чистая архитектура — как обрабатывать зависимости usecase

#node.js #clean-architecture

#node.js #чистая архитектура

Вопрос:

Я занимаюсь рефакторингом одного из моих старых приложений, используя концепцию вариантов использования «чистая архитектура». Я немного запутался в том, как использовать общие проверки данных и объектов

например, существует 2 варианта использования

  • Разрешить администраторам импортировать новый шаблон рабочего процесса
  • Разрешить администраторам создавать новый шаблон рабочего процесса

Вышеуказанные варианты использования вызываются из контроллеров.

В обоих вышеуказанных случаях существуют некоторые общие проверки на уровне базы данных, такие как:

  • Существует ли уже рабочий процесс с таким же именем?

Чтобы обрабатывать эти проверки, я должен сделать это как отдельный вариант использования, например «checkIfWorkflowWithSameNameExists()»?

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

  1. Может ли один вариант использования напрямую вызывать другой вариант использования
 export function importNewWorkflowTemplate(specs){

  const { workflowRepository  } = specs;

  const exists = checkIfWorkflowWithSameNameExists()
  if(exists){
    //return error
  }
  
  return new (payLoad) => {
    //logic
  }
}

  
  1. Должен ли я внедрять зависимые варианты использования
 export function importNewWorkflowTemplate(specs){

  const { workflowRepository, checkIfWorkflowWithSameNameExists  } = specs;

  return new (payLoad) => {
    //logic
  }
}

  
  1. Должна ли проверка принадлежать внешнему уровню, такому как контроллер?

Ответ №1:

То, что вы описываете — checkIfWorkflowWithSameNameExists() — не является прецедентом.

Это просто метод, размещенный в службе домена, такой как репозиторий. Это может быть метод репозитория в вашем репозитории рабочего процесса, такой как hasWorkflowWithName (имя). Репозиторий представляет собой коллекцию агрегатов и, следовательно, лучше всего знает, существует ли уже один с таким же именем.

Если существует более сложная логика домена для проверки существующего репозитория, а затем либо для выполнения некоторой обработки ошибок, либо для выполнения определенной логики для создания логики, вы также можете рассмотреть возможность инкапсуляции этих шагов внутри метода службы домена. В этом случае интерфейс репозитория рабочего процесса будет внедрен в службу домена рабочего процесса, которая затем снова будет внедрена в варианты использования.

При этом вы могли бы использовать одну и ту же службу домена в обоих вариантах использования, и вариант использования отвечает за организацию трансляции между внешними командами и интерфейсом службы домена и соответствующими объектами домена.

Комментарии:

1. Спасибо. Я рассматриваю это, допустим, у меня есть логика для построителя запросов. Разработчикам запросов необходимо знать столбцы базы данных, и в то же время они не несут ответственности за управление доступом к данным. Итак, вы разместите конструктор запросов в качестве службы домена?

2. Доменная служба не должна иметь никакой зависимости от постоянства. Это также означает, что весь ваш код, определяющий структуру базы данных (например, имена столбцов), также должен быть частью уровня инфраструктуры. Обычно для таких случаев используется репозиторий. Вы определяете интерфейс репозитория на уровне домена, но фактическая реализация, которая знает о конкретном доступе к базе данных, находится на уровне инфраструктуры.