Arquitetura: camadas de serviços em Domain-Driven Design

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:

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.

Dentro do mesmo projeto de domínio, vamos adicionar o serviço que salva a pessoa.

No projeto de Infraestrutura, iremos adicionar o serviõ de envio de mensagens.

E por fim, vamos adicionar o serviço na camada de aplicação.

Este projeto está disponível no meu GitHub no endereço a seguir:

  • https://github.com/tiagopariz/DDDServicesLayers

C# e Mvc: mapa do Google com marcadores

Você já precisou colocar um mapa em seu site ou aplicativo? E este mapa precisaria mostrar vários locais, como unidades comerciais de um empresa com filiais? Neste artigo eu mostro como exibir um mapa usando a API Google e adicionar os devidos marcadores em um site feito em C# e MVC.

Mas primeiro, você vai precisar de uma chave do Google API Maps, que pode ser adquirida no endereço:

Chave na mãe, vamos criar uma pasta chamada CSharpMvcGoogleMapWithMarkers e dentro dela incluir outra chamada src e então abrir no Visual Studio Code.

Se você ainda não usou o VS Code e/ou ainda usa apenas o Visual Studio convencional, eu fiz um artigo para quebrar  o gelo com este editor opensource da Microsoft.

Dentro da pasta src, crie outra pasta chamada CSharpMvcGoogleMapWithMarkers.Mvc, volte na pasta raiz e abra esta pasta no terminal e vá digitando os comandos a seguir:

Crie uma solução, para que seja possível abrir no Visual Studio convencional:

Abra a pasta do projeto MVC:

Crie um projeto C# do tipo MVC:

Volte a pasta raiz:

Adicione o projeto MVC na solução:

Execute o site e veja no navegador:

A saída do terminal será esta, onde o VS Code vai informar a URL local para testar, normalmente https://localhost:5001 ou http://localhost:5000.

Copie e cole no navegador o endereço e confira a página:

Crie um novo controller, chamado StoreController, que será uma tela com um mapa e ponto onde há lojas de uma empresa. Para isso, clique o botão direito sobre a pasta Controllers, clique em New file e defina o nome como StoreController.cs.

Clique o botão direito sobre a pasta Models, clique em New file e defina o nome como StoreViewModel.cs.

Para facilitar, adicione um novo item de menu chamado Know our stores que abre a action Index do controller Store, para isto edite o arquivo Views/Share/_Layout.cshtml.

 

Clique o botão direito sobre a pasta Views, clique em New folder e digite Store, em seguida clique o botão direito sobre Store e em New file e defina o nome como Index.cshtml.

Explicando o código Javascript do mapa

Declaramos uma variável chamada map e criamos uma função initMap (), serão informadas as coordenadas inciais e logo após definido os marcadores.

Agora vamos definir a posição e o zoom do mapa, instanciando um novo objeto google.maps.Map, que recebe os parâmetros  que informa qual a div que será renderizado o mapa, as coordenadas e o zoom.

Se você quiser entender melhor como funciona o Zoom e demais opções, clique no link abaixo para a documentação do google:

https://developers.google.com/maps/documentation/javascript/tutorial

Agora, com o mapa pronto, é adicionar os marcadores, para isso é só instanciar um objeto do tipo google.maps.Marker e usar a função setMap().

Segue a documentação do Google sobre marcadores:

https://developers.google.com/maps/documentation/javascript/markers

Ao carregar o mapa, todas as lojas serão exibidas como marcadores no mapa.

Pronto, agora temos uma mapa com marcadores de locais.

Este projeto pode ser conferido no meu repositório do GitHub:

  • https://github.com/tiagopariz/CSharpMvcGoogleMapWithMarkers

Git: Corrija o autor dos commits

O git tem uma característica que pode ser um problema se o programador não prestar atenção ao clonar e enviar seus primeiros commits para repositórios quando ele trabalha em projetos diferentes, que é esquecer de alterar o autor e e-mail usado no repositório.

Mas para entender o que ocorre e buscar uma solução, vamos simular uma situação a seguir:

Imagine que eu trabalho em mais de uma projeto, e que ao clonar o primeiro eu defini as configurações globais de nome do autor e e-mail corretas do primeiro projeto. Fiz algumas alteração, e envio meu commit. Até ai, tudo bem.

Se eu conferir meu log, vai estar lá o commit, com o nome de usuário e e-mail corretos.

Agora eu mudei de projeto, e estou trabalhando em outro código, onde meu e-mail mudou, eu clono o novo repositorio, usando o novo usuário e senha, e começo a trabalhar, enviando alguns commits, quando eu vou ver o log, percebo que dei push com o usuário global do outro repositório.

E agora? como consertar esta bagunça, pois meu e-mail neste projeto é tiago@timeq.me.

Acredite, tive este problema ao usar o comando amend, que inclui as alterações no último commit, só não havia percebido que o ultimo commit não era meu, passei mais de uma mês commitando no usuário do meu colega.

Vamos primeiro explicar qual foi o meu primeiro erro: eu devo configurar estes dados por repositório e não global, e admito que esqueço muitas vezes! Então  vamos consertar isto primeiro, definindo o usuário e e-mail sem o parâmetro –global.

Vamos enviar um novo commit e conferir o log.

Finalmente! Nosso git está versionando com o usuário correto, mas ainda temos um problema, os dois commits enteriores não mudaram, ou seja, somente os commits futuros serão armazenados de forma correta. Mas sem pânico! temos a solução para isto, e ela vem em forma de uma comando complicado, mas milagroso! Digite no bash a instrução abaixo, informando o e-mail antigo em OLD_EMAIL e os novos usuários e e-mails em CORRECT_EMAIL:

Após digitar ou copiar o comando, os commits serão reescritos, esta operação pode levar bastante tempo, dependendo do tamanho do repositório.

Ao conferir o log, veremos que os commits foram corrigidos.

Será preciso forçar forçar um push:

Algumas recomendações

  1. Precisa ser em uma branch desprotegida,
  2. Faça esta alterações depois que todos tenha enviado suas alterações, e em um horário onde ninguém esteja usando o repositório.
  3. Se possível, faça um backup dos repositórios.