Quando desenvolvemos usando a abordagem dirigida por modelos, é preciso entender as responsabilidades e local de cada camada, e entre todas as usadas, um tipo é responsável por chamar e expor de forma abstraída e funcional todas as regras de negócio do domínio, elas são chamadas de serviços.
Os serviços podem estar em alguns locais da arquitetura do software, conforme a necessidade e a função exercida para a solução. Segundo Eric Evans, em seu livro Domain-Driven Design, os serviços são divididos ao menos em três camadas:
Conteúdo
Aplicativo – Serviço de mais externo
- Digere as entradas, tais como requisições em txt, xml e Json,
- Envia mensagens para o serviço de domínio para complementação
- Espera a confirmação,
- Decide enviar uma notificação através de um serviço de infraestrutura
Domínio – Regras de negócios
- Interage com objetos necessários e dispara comportamentos
- Fornece confirmações do resultado
Infraestrutura – Mensagens e outras comunicações externas
- Envia mensagens
- Recebe mensagens
Mas, sem mais delongas, montei uma aplicação bem simples para demonstrar a ideia. São três projetos: Domínio, aplicação e Infraestrutura de mensagens.
Primeiro, vamos criar, no projeto de domínio, uma entidade que representa uma pessoa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; namespace DDDServicesLayers.Domain.Entities { public class Person { public Person(Guid id, string name) { Id = id; Name = name; } public Guid Id { get; private set; } public string Name { get; private set; } } } |
Dentro do mesmo projeto de domínio, vamos adicionar o serviço que salva a pessoa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using DDDServicesLayers.Domain.Entities; namespace DDDServicesLayers.Domain.Services { public class PersonService { public PersonService(Person person) { Person = person; } public Person Person { get; private set; } public bool Success { get; private set; } public void Save() { // Save person logic Success = true; } } } |
No projeto de Infraestrutura, iremos adicionar o serviõ de envio de mensagens.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; namespace DDDServicesLayers.Infra.Messages.MessageServices { public class EmailService { public EmailService(string to, string subject, string body) { To = to; Subject = subject; Body = body; } public string To { get; private set; } public string Subject { get; private set; } public string Body { get; private set; } public bool Success { get; private set; } public void Send() { // Send e-mail Success = true; } } } |
E por fim, vamos adicionar o serviço na camada de aplicação.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using DDDServicesLayers.Domain.Entities; using DDDServicesLayers.Domain.Services; using DDDServicesLayers.Infra.Messages.MessageServices; namespace DDDServicesLayers.Application.AppServices { public class PersonAppService { private readonly Person _person; public PersonAppService(string name) { _person = new Person(Guid.NewGuid(), name); } public void Save() { var personServiceSave = new PersonService(_person); personServiceSave.Save(); if (personServiceSave.Success) { var emailService = new EmailService("test@mail.com", "Confirm", "Register saved."); emailService.Send(); } } } } |
Este projeto está disponível no meu GitHub no endereço a seguir:
- https://github.com/tiagopariz/DDDServicesLayers