⚡ Introdução
Se você trabalha com desenvolvimento, provavelmente já precisou repetidamente criar vários cadastros semelhantes em diversas telas. O que leva a tempo gasto com essa repetição e a chance de erros ao replicar seu código. Tivemos uma situação muito parecida na JJConsulting.
⚠️ Nosso problema
Há algum tempo, desenvolvemos um produto e começamos a implementá-lo em diversos clientes. Cada um deles exigia campos específicos e regras de negócio personalizadas. Inicialmente, replicamos o código para cada cliente, adaptando-o às suas necessidades. Essa abordagem revelou-se rapidamente insustentável.
Decidimos então parametrizar as regras dentro de um único sistema, permitindo ativar ou desativar campos e funcionalidades conforme necessário. Contudo, à medida que mais clientes eram adicionados, a complexidade da parametrização crescia exponencialmente, tornando a manutenção do sistema inviável.
Buscando uma solução mais eficaz, exploramos alternativas na comunidade open-source e descobrimos o conceito de Dicionário de Dados. Grandes empresas de ERP utilizam essa abordagem para permitir que cada cliente personalize o sistema conforme suas necessidades, mantendo uma base de código única.
Não encontramos uma solução open-source em .NET que atendesse às nossas necessidades de configurar campos e regras de negócio de forma eficiente. Assim, decidimos criar nossa própria biblioteca: JJMasterData. Inicialmente, parecia uma ideia ousada, mas o resultado superou nossas expectativas. Adotamos o JJMasterData em diversos sistemas, e sua flexibilidade e eficiência transformaram nossa abordagem de desenvolvimento de software.
📘 O que é um dicionário de dados?
O Dicionário de Dados é um repositório centralizado que documenta tudo sobre os dados de um sistema: nome do campo, tipo, tamanho, regras de validação, origem, relacionamentos, índice e etc. Ele é o contrato técnico que alinha seu banco de dados com sua regra de negócio.
Mas o dicionário sozinho não resolve tudo. Como geramos telas de cadastro a partir do dicionário de dados? É aí que entra o JJMasterData.
O JJMasterData é uma biblioteca open-source escrita em .NET que permite criar CRUDs, ou seja, formulários que podem ler, criar, alterar ou deletar dados, rapidamente a partir dos dicionários de dados, além de outras funcionalidades, como exportação e importação de dados. Além disso, é possível gerar endpoints em uma Web API para se integrar com outros sistemas.
Também quando necessário, é possível escrever código customizado para o JJMasterData que adapta os formulários gerados a sua própria regra de negócio.
🔧 Como funciona o JJMasterData
O JJMasterData é uma ferramenta de gerenciamento de dados que armazena a estrutura das informações do seu sistema e gera automaticamente as telas de cadastro, eliminando a necessidade de codificar cada detalhe manualmente.
Tudo começa com o preenchimento do dicionário de dados, onde você define as tabelas do sistema, seus campos, tipos de dados, validações e relacionamentos. Essas definições são salvas em uma tabela central — como se fosse uma "tabela das tabelas" — que serve como base para a geração dinâmica dos nossos formulários.
Quando uma tela de cadastro precisa ser exibida, o JJMasterData consulta esse dicionário e monta a interface de forma automática. Alterações, como a inclusão de um novo campo ou a modificação de uma regra, são refletidas instantaneamente na interface, sem necessidade de recompilar o sistema.
Além disso, o JJMasterData permite a inclusão de regras de negócio personalizadas, como validações específicas ou cálculos automáticos, tudo sem alterar o código-fonte principal. Isso acelera o desenvolvimento, facilita a manutenção e reduz significativamente a ocorrência de erros.
Separamos tudo em 3 grandes camadas, a camada responsável em se comunicar com o banco de dados que chamamos de
JJMasterData.Commons
. Nela abstraímos a geração de scripts SQL por exemplo.
Em seguida, temos o JJMasterData.Core
, onde se renderiza o HTML dos formulários após se ter os
dados recuperados. Nesse assembly temos nosso próprio DSL (Domain Specific Language) em C# para se montar os HTMLs dos
componentes.
Por último, temos o JJMasterData.Web
, nossa Razor Class Library. As rotas localizadas em
/DataDictionary são responsáveis por gerir nossos dicionários, onde são gravados na nossa tabela central em
formato JSON. Também se pode gravar eles em um banco NoSQL por exemplo, caso implemente a interface
responsável por gravar os dicionários. Já a rotas que ficam em /MasterData são responsáveis por renderizar os formulários para o usuário final. O
permissionamento delas pode ser feito usando o próprio ASP.NET Core na inicialização na aplicação
🌟 Vantagens de usar o JJMasterData
Com nossa biblioteca, você tem mais agilidade, flexibilidade e controle sobre os dados e interfaces do seu sistema.
Na dúvida em usar? Veja algumas vantagens:
- Evita duplicação de código
- Geração automática de telas de cadastro baseadas no dicionário
- Adaptação rápida a novas regras de negócio sem alterar a base de código
- Redução drástica no tempo de desenvolvimento de CRUDs
- Facilidade de manutenção e evolução da aplicação
- Integração com outros sistemas de maneira fácil
- Suporte a importação e exportação de dados para diferentes formatos de arquivo
O próprio conteúdo deste blog é gerido por um formulário do JJMasterData 🚀.
A maior vantagem na minha opnião, é a junção da documentação da estrutura do banco com o desenvolvimento rápido sem re-compilar a aplicação. Isso agiliza muito o desenvolvimento, tanto para a equipe entender o sistema quanto para se criar melhorias rapidamente.
🐙 Veja mais no GitHub
Trabalho no desenvolvimento da biblioteca junto com o Lucio Pelinson. O código é aberto, e você pode acessar, contribuir ou até mesmo realizar um fork do JJMasterData conforme suas necessidades. Acesso nosso repositório oficial no GitHub para saber mais.