Следует ли преобразовать этот сценарий в службу домена, которая вызывается службой приложения, где служба домена обрабатывает ответ хранилища и выбрасывает ошибку?
Да, вероятно, это лучший путь.
В 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
, если клиент не существует.
Надеюсь, это поможет!
Прикрепляю к посту несколько видео по теме: