Hoje tive uma discussão acalorada sobre nosso aplicativo MVC. Temos um site escrito em MVC ( ASP.NET ) e, geralmente, segue o padrão de fazer algo na exibição -> pressionar o controlador -> o controlador cria um modelo (chama um gerente que obtém os dados, cria o modelo no diretório próprio método do controlador) -> o modelo é exibido -> enxaguar e repetir.
Ele disse que nosso código estava muito acoplado. Por exemplo, se quiséssemos um aplicativo de desktop também, não poderíamos usar nosso código existente.
A solução e as melhores práticas que ele disse é criar uma API e, em seguida, criar seu site em cima da API, e criar um aplicativo de desktop, aplicativo móvel etc. é muito simples.
Parece-me uma má ideia por várias razões.
De qualquer forma, parece que não consigo encontrar nada pesquisando no Google que possa discutir essa prática. Alguém tem alguma informação sobre prós, contras, por que você deveria, por que não deveria ou mais leituras?
Por algumas razões, acho uma má ideia:
É muito abstrato para executar seu back-end em uma API. Você está tentando torná-lo muito flexível, o que tornará uma bagunça incontrolável.
Todo o material incorporado ao MVC parece inútil, como funções e autenticação. Por exemplo, [Autorizar] atributos e segurança; você terá que fazer o seu próprio.
Todas as suas chamadas à API exigirão informações de segurança anexadas, e você precisará desenvolver um sistema de token e outros enfeites.
Você terá que escrever chamadas completas da API para todas as funções que seu programa executará. Praticamente todos os métodos que você deseja implementar precisarão ser executados em uma API. Uma operação Obter / Atualizar / Excluir para cada usuário, além de uma variante para a outra operação, por exemplo, atualizar nome do usuário, adicionar usuário a um grupo, etc. etc. e cada um deles seria uma chamada de API distinta.
Você perde todos os tipos de ferramentas, como interfaces e classes abstratas, quando se trata de APIs. Coisas como o WCF têm suporte muito tênue para interfaces.
Você tem um método que cria um usuário ou executa alguma tarefa. Se você deseja criar 50 usuários, basta chamá-lo 50 vezes. Quando você decide fazer esse método como uma API, seu servidor da web local pode se conectar a pipes nomeados e não há problema - o seu cliente de desktop também pode acessá-lo, mas de repente sua criação de usuários em massa envolve martelar a API pela Internet 50 vezes, o que não é um problema. é bom. Então você precisa criar um método em massa, mas na verdade você está apenas criando para clientes de desktop. Dessa forma, você acaba tendo que: a) modificar sua API com base no que está se integrando a ela e não pode se integrar diretamente a ela; b) fazer muito mais trabalho para criar uma função extra.
YAGNI . A menos que você esteja planejando especificamente escrever dois aplicativos que funcionem de forma idêntica, um da Web e um do Windows, por exemplo, é uma enorme quantidade de trabalho extra de desenvolvimento.
A depuração é muito mais difícil quando você não consegue avançar de ponta a ponta.
Muitas operações independentes que exigirão muitas idas e vindas, por exemplo, algum código pode obter o usuário atual, verificar se o usuário está na função de administrador, obter a empresa à qual o usuário pertence, obter uma lista de outros membros, enviar todos eles um email. Isso exigiria muitas chamadas de API ou a gravação de um método sob medida na tarefa específica que você deseja, onde o único benefício desse método sob medida seria a velocidade, mas a desvantagem seria que seria inflexível.
Provavelmente, mais algumas razões pelas quais essas coisas estão fora de minha cabeça.
Parece-me que, a menos que você realmente precise de dois aplicativos idênticos, não vale a pena. Também nunca vi um aplicativo ASP.NET criado dessa maneira, você teria que escrever dois aplicativos separados (a API e o seu código) e a versão controlá-los também (se sua página de usuário receber um novo campo, você ' você precisa atualizar a API e seu código de consumo simultaneamente para garantir que não haja efeitos negativos ou colocar muito trabalho extra para mantê-la robusta).
Edit: Algumas ótimas respostas, realmente começando a ter uma boa idéia do que tudo isso significa agora. Então, para expandir minha pergunta, como você estruturaria um aplicativo MVC para seguir essa estrutura da API?
Por exemplo, você tem um site que exibe informações sobre um usuário. No MVC, você tem:
Página HTML de exibição - (CS) que exibe um controlador UserViewModel - chama GetUser () e cria um UserViewModel que ele passa para a classe Manager de exibição (tipo de sua API) que possui um método GetUser.
O controlador usa GetUser (), mas você também deseja um aplicativo de desktop. Isso significa que seu GetUser precisa ser exposto por meio de algum tipo de API. Você pode querer uma conexão TCP, WCF ou talvez Remoting. Você também deseja um aplicativo móvel que seja RESTful, pois as conexões persistentes são difíceis.
Então, você escreveria uma API para cada uma, um serviço Web WCF que possui o método GetUser () e o código apenas return new UserManager().GetUser()
? E um método mvc 4 web api que faz a mesma coisa? Continuando a chamar GetUser diretamente no seu método de controlador MVC?
Ou você escolheria a solução que funcionaria para todos os três (serviço REST da API da Web) e criaria tudo sobre isso, para que todos os três aplicativos façam chamadas de API (as de mvc, para a máquina local).
E este é apenas um cenário perfeito teórico? Eu posso ver grandes despesas gerais no desenvolvimento dessa maneira, especialmente se você precisar desenvolver de uma maneira que permita executar operações de maneira RESTful. Penso que parte disso foi abordada nas respostas.
Edit 2: Depois de ler mais coisas, coloquei um comentário abaixo que acho que pode explicar. A questão é um pouco complicada, eu acho. Se você escrever seu back-end como uma API, confundi-me pensando que deveria haver um único serviço da Web que tudo (aplicativo mvc, aplicativo para desktop, aplicativo móvel) chama para fazer coisas.
A conclusão a que cheguei é que o que você realmente deve fazer é garantir que a camada de lógica de negócios esteja corretamente dissociada. Observando meu código, eu já faço isso - o controlador chama GetUser()
um gerente e cria um modelo de exibição para renderizar com um View. Realmente, a camada de lógica de negócios é uma API. Se você deseja chamá-lo em um aplicativo de desktop, precisará escrever algo como um serviço WCF para facilitar a chamada. Mesmo apenas ter um método WCF chamado GetUser()
que contém o código return MyBusinessLayer.GetUser()
seria suficiente. Portanto, a API é a lógica de negócios, e as APIs WCF / Web etc. são apenas um pouco de código para permitir que aplicativos externos o chamem.
Portanto, há alguma sobrecarga, pois é necessário agrupar sua camada de lógica de negócios em diferentes APIs, dependendo do que você precisar, e você precisará escrever um método de API para cada operação que deseja que seus outros aplicativos façam, além de precisar resolvemos uma maneira de fazer autenticação, mas na maioria das vezes é a mesma coisa. Coloque sua lógica de negócios em um projeto separado (biblioteca de classes) e você provavelmente não terá problemas!
Espero que esta interpretação esteja correta. Obrigado por toda a discussão / comentários que gerou.