DDD: Могут ли службы приложений выдавать ошибки домена?

DDD: Могут ли службы приложений выдавать ошибки домена?
DDD: Могут ли службы приложений выдавать ошибки домена? - enginakyurt @ Unsplash

Следует ли преобразовать этот сценарий в службу домена, которая вызывается службой приложения, где служба домена обрабатывает ответ хранилища и выбрасывает ошибку?

Да, вероятно, это лучший путь.

В Domain-Driven Design ответственность за выброс ошибок домена должна быть передана на уровень домена; в конце концов, эти знания приходят из домена. Поэтому было бы лучше реализовать логику проверки существования сущности в службе домена и выбрасывать ошибку домена оттуда.

Если да, то как я могу назначить эту службу?

Вот пример того, как можно рефакторить код, чтобы делегировать обработку ошибок службе домена:

import { CustomerRepository } from '@/main/com/acme/sales/domain/repositories';
import { CustomerNotFound } from '@/main/com/acme/sales/domain/errors';
import { GetCustomerService } from '@/main/com/acme/sales/domain/services';
import { GetCustomerHistoryInputDTO } from './dtos/inputs';
import { CustomerHistoryOutputDTO } from './dtos/output';

export class GetCustomerHistory {
  constructor(
    private readonly customerRepository: CustomerRepository,
    private readonly getCustomerService: GetCustomerService,
  ) {}

  execute(input: GetCustomerHistoryInputDTO): CustomerHistoryOutputDTO {
    const customer = this.getCustomerService.getById(input.customerId);
    return new CustomerHistoryOutputDTO({ customer });
  }
}
import { CustomerRepository } from '@/main/com/acme/sales/domain/repositories';
import { CustomerNotFound } from '@/main/com/acme/sales/domain/errors';

export class GetCustomerService {
  constructor(private readonly customerRepository: CustomerRepository) {}

  getById(id: string): Customer {
    const customer = this.customerRepository.getById(id);
    if (customer == null) throw new CustomerNotFound();
    return customer;
  }
}

Класс GetCustomerHistory - это прикладная служба, которая предоставляет внешний API для получения истории клиента. Он полагается на класс GetCustomerService, который является доменной службой, отвечающей за поиск клиента по его id и выдающей ошибку CustomerNotFound, если клиент не существует.

Надеюсь, это поможет!

Прикрепляю к посту несколько видео по теме:

Прикрепленное видео 1 - НЕ ООП ЕДИНЫ! Domain Driven Design на примере ХОЛОДИЛЬНИКА, Tech Lead Борис Беньковский

Прикрепленное видео 2 - Domain Driven Design – просто о сложном. Дмитрий Науменко

Прикрепленное видео 3 - Константин Густов — DDD в микросервисах сложность против сложности


LetsCodeIt, 18 января 2023 г., 17:12