Estou trabalhando em uma série de serviços cujo o objetivo é calcular vários tipos de Perfis de Leitura para companhias de Energia Elétrica.
Um perfil de Leitura é um gráfico que detalha o consumo de energia em um determinado tempo.
Cada companhia tem o seu de cálculo e cada cálculo depende de leituras de clima e constantes matemáticas que são criadas pelos especialistas que lá trabalham.
Eu dividi o sistema nos seguintes serviços:
- Weather Service - Que busca os dados de clima.
- WRF Service - Onde ficam as constantes de cada companhia, existe um serviço para cada uma delas, pois são bancos e tabelas completamente diferentes.
- Profile Service que busca o perfis que eu tenho que calcular, nele vem certos dados que eu vou usar para gerar os valores por exemplo se ele é residencial, qual o fuso do lugar, qual estação levar em conta e outras coisas necessárias pro cálculo.
- Profile Generation Service, que será um serviço para cada companhia de energia pelo mesmo motivo do WRF ter um serviço pra cada companhia, métodos de cálculos diferentes (são neles que moram os meus problemas).
Esses serviços tem as camadas de persistência, domínio, aplicação e a API REST que é o ponto de entrada deles.
Os serviços que estão prontos basicamente são apoio para a lógica de negócio principal (Profile Generation service), apesar de cada um ter suas validações, banco próprio e tudo mais, não tem lógica de negócio complexa, então consegui implementar facilmente as queries e comandos necessários.
Os problemas começaram no serviço que vai consumi-los e calcular os valores do Profile.
Na camada de persistência, eu criei as classes que vão consumir os serviços e o banco de dados, até aí tudo bem.
Então eu criei classes de Query que trazem esses dados da camada de persistência na camada de aplicação.
No comando que vai gerar os valores, eu busco os dados usando essas classes de query.
A primeira dúvida é: É OK Um comando ler dados de uma Classes de Query, ou seja uma leitura horizontal na mesma camada? Ou eu devo acessar a persistência diretamente, como eu faria com um comando simples?
A outra dúvida é: Eu preciso validar se os dados que vieram dos serviços estão OK. Onde eu faço essa validação, nas Queries ou no comando de onde eu estou buscando os dados?
A última dúvida é: Onde eu implemento a lógica do cálculo que vai receber os dados de todos os serviços? Na camada de domínio? No próprio comando?
Desculpe pelo livro, mas todos os exemplos que achei de CQRS e DDD não tem uma estrutura complexa como essa de exemplo.
Espero contar com a sua ajuda.