No Design Orientado a Domínio, a Camada de Domínio pode ter vários serviços (tradicionais). Por exemplo, para o domínio do usuário, podemos ter:
- Um UserFactory, que cria objetos de Usuário de maneiras diferentes
- Um UserRepository, responsável por interagir com os Persistence Services na camada de infraestrutura
Um UserService na camada de domínio é simplesmente um mediador e / ou fachada para esses dois serviços e a camada de infraestrutura, ou há mais?
Respostas:
Domain services
são melhor descritos pelo que não são:Entities
nemAggregate roots
Value objects
Entity
ou umValue object
Um exemplo de a
Domain service
é aSaga/Process manager
: coordena um processo de execução longa envolvendo múltiplosAggregate roots
, possíveis de diferentesBounded contexts
.Dito isto, o que é
Domain service
e como é implementado são duas coisas ortogonais.Alguns serviços de domínio como a
UserRepository
(composto por uma interface definida naDomain layer
e uma implementação concreta naInfrastructure layer
) podem ser implementados usando oFacade
padrão de design. Outros serviços de domínio não são.Não existe uma regra rígida sobre como implementá-los, além da regra importante de que
Domain layer
não deve depender de outras camadas (e do SOLID ).fonte
Eu vejo serviços no DDD como resultado da inversão de dependência .
Se você usar dependências "simples", seu código de domínio chamaria o banco de dados para salvar ou consultar uma entidade, ou fábrica, que cria uma entidade, vinculada ao banco de dados ou serviço externo ou algum outro tipo de código de infraestrutura.
Mas não é assim que o código do domínio deve ser. O código do domínio não deve depender do código da infraestrutura. Como essa dependência dificulta o teste e, possivelmente, a reutilização. É por isso que você inverte essa dependência. Você faz com que o código de infraestrutura dependa do código do domínio. E para fazer isso, você precisa apresentar uma abstração. Uma abstração que define qual comportamento o código de domínio espera que seja implementado pela infraestrutura.
E os serviços no DDD são essa abstração. Na maioria dos casos, para o código de domínio, esses serviços devem ser interfaces simples. E a implementação deve estar no código de infraestrutura, que depende dessas interfaces.
fonte