Estou com sérias dúvidas sobre o design do meu aplicativo Web.
Eu queria separar a lógica de negócios da interface, então criei uma API da Web que lida com todas as solicitações ao banco de dados.
É uma API da Web do ASP.NET com estrutura de entidade e uma unidade de trabalho e padrão de repositório genérico. Até agora, tudo está bem.
PROBLEMA
Onde eu preciso de ajuda é que não consigo descobrir uma maneira eficiente de compartilhar objetos entre a API e o aplicativo.
Não quero serializar diretamente o objeto da entidade, pensei que seria uma prática ruim porque, se o modelo da entidade mudar, eu poderia acabar serializando objetos grandes sem motivo.
Como é implementado agora
Como minha interface é um aplicativo Web do ASP.NET em C # e minha API está em C #, criei uma biblioteca comum com a definição de todas as minhas classes que quero compartilhar entre elas.
Sei que a solução não funcionará quando desenvolver um aplicativo para Android. Terei que criar minhas aulas novamente em Java, mas esse não é o meu maior problema.
O problema é que sinto que estou sempre convertendo meus objetos.
EXEMPLO
Aqui está um exemplo do meu fluxo de trabalho:
Começo com um modelo com todos os objetos e as anotações de dados para o meu formulário, em seguida, o usuário colocaria esse modelo em um controlador.
No controlador, tenho que converter esse modelo em uma classe na minha biblioteca comum e depois enviar esse objeto para minha API.
Em seguida, um controlador na minha API captura a chamada e converte esse objeto em um objeto de entidade para atualizar o banco de dados.
Então eu tenho 3 aulas
- O modelo para a visualização com todas as anotações de dados para a validação (Cliente)
- As classes de biblioteca comuns para compartilhar os objetos (DLL)
- As classes de entidade (API)
Tenho a sensação de que faço algo realmente errado. Existe algo mais elegante? Gostaria de ter uma boa solução para esse problema antes que o projeto fique grande demais.
Respostas:
Sei que pode parecer que você está convertendo objetos o tempo todo entre objetos do banco de dados, objetos de transferência de dados, objetos do cliente com lógica de validação e assim por diante, mas eu diria que não, você não está fazendo nada errado .
Cada um desses objetos pode representar a mesma unidade de informação, mas eles têm responsabilidades muito diferentes. O objeto de banco de dados é sua interface de comunicação com o banco de dados e deve ser mantido na camada de banco de dados, pois pode ou não ter diferentes anotações de metadados e / ou detalhes desnecessários sobre a implementação do banco de dados.
Seu objeto de transferência de dados é a interface de comunicação com os consumidores da API. Devem ser o mais limpos possível para facilitar o consumo fácil de diferentes idiomas / plataformas. Isso pode impor certas restrições sobre a aparência e o comportamento delas, dependendo de quais consumidores de API você deseja oferecer suporte.
Seus objetos de cliente com lógica de validação realmente não fazem parte do seu projeto de API, eles fazem parte do seu projeto de consumidor. Estes não podem ser iguais aos objetos de transferência de dados nesse caso, pois você está adicionando lógica extra específica do cliente (neste caso, atributos de validação) sobre os quais o servidor não sabe nada (e não deve saber nada!). Você não deve conte esses objetos como parte da sua API, porque eles realmente não são. Eles são altamente específicos para aplicativos de consumo e alguns aplicativos que consomem sua API podem até não precisar criar esses objetos e podem sobreviver apenas nos objetos de transferência de dados. Por exemplo, se você não precisou de validação, não precisaria de uma camada extra de objetos que sejam completamente idênticos aos seus objetos de transferência de dados.
Para mim, parece que cada um dos três tipos de objetos é muito bem mapeado para uma única responsabilidade, que é a codificação limpa e as boas práticas. Infelizmente, código limpo e boas práticas às vezes significa que você está escrevendo muito código extra e pulando em bastidores extras "apenas porque". E durante a codificação, pode ser difícil apreciar o valor que isso está dando a você - mas assim que você libera seu aplicativo e começa a apoiá-lo ou a adicionar novos recursos para a próxima versão, provavelmente começará a perceber que demorou um pouco para separar essas preocupações adequadamente em primeiro lugar. (Sem mencionar que você '
Eu também odeio escrever código de conversão entre diferentes tipos de objetos como este, mas minha solução é geralmente uma das seguintes:
fonte