Где проверка валидации входит в шаблон репозитория?

Допустим, у меня есть объект под названием User, у которого много сообщений. Моя служба выглядит так, чтобы удалить сообщение:

void DeletePost(int postId, int userId);

Где мой код проверки? (убедитесь, что у пользователя есть разрешение на удаление). Должен ли я сделать это в репозитории с 1 вызовом базы данных? Или я должен выполнить эту проверку на уровне службы, где я делаю 2 вызова:

  • Получить пользователя по имени пользователя.
  • Вызов удалять после того, как пользователь выполнил проверку.

У меня будет 2 репозитория, 1 для пользователя и 1 для сообщения, каждый из которых выглядит следующим образом:

// From the PostRepository.
void Delete(int postId); //May have to add a userId param if I do validation in repository
//From the UserRepository.
User GetUser(int userId);

Ответ 1

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

Ответ 2

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

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