Tuve una acalorada discusión hoy sobre nuestra aplicación MVC. Tenemos un sitio web escrito en MVC ( ASP.NET ), y generalmente sigue el patrón de hacer algo en la vista -> presionar el controlador -> el controlador construye un modelo (llama a un administrador que obtiene los datos, construye el modelo en el método del controlador en sí) -> el modelo va a ver -> enjuagar y repetir.
Dijo que nuestro código estaba demasiado ajustado. Por ejemplo, si también quisiéramos una aplicación de escritorio, no podríamos usar nuestro código existente.
La solución y las mejores prácticas, dijo, es crear una API, y luego construir su sitio web sobre su API, y luego construir una aplicación de escritorio, una aplicación móvil, etc. es muy simple.
Esto me parece una mala idea por varias razones.
De todos modos, parece que no puedo encontrar nada buscando en Google que pueda discutir esta práctica. ¿Alguien tiene alguna información sobre pros, contras, por qué debería, por qué no debería o más lecturas?
Algunas razones, creo que es una mala idea:
Es demasiado abstracto ejecutar su back-end desde una API. Estás tratando de hacerlo demasiado flexible, lo que lo convertirá en un desastre inmanejable.
Todo lo integrado en MVC parece inútil, como roles y autenticación. Por ejemplo, [Autorizar] atributos y seguridad; Tendrás que rodar el tuyo.
Todas sus llamadas a la API requerirán información de seguridad adjunta, y tendrá que desarrollar un sistema de token y demás.
Tendrá que escribir llamadas API completas para cada función que su programa realice. Casi todos los métodos que desee implementar deberán ejecutarse desde una API. Un Get / Update / Delete para cada usuario, más una variante para cada operación, por ejemplo, actualizar el nombre de usuario, agregar un usuario a un grupo, etc., etc. y cada uno sería una llamada API distinta.
Pierdes todo tipo de herramientas como interfaces y clases abstractas cuando se trata de API. Cosas como WCF tienen un soporte muy tenue para las interfaces.
Tiene un método que crea un usuario o realiza alguna tarea. Si desea crear 50 usuarios, puede llamarlo 50 veces. Cuando decida hacer este método como API, su servidor web local puede conectar canales con nombre a él y no hay problema: su cliente de escritorio también puede acceder, pero de repente su creación de usuario a granel implicará martillar la API a través de Internet 50 veces, lo cual no es No está bien. Por lo tanto, debe crear un método masivo, pero en realidad solo lo está creando para clientes de escritorio. De esta manera, terminas teniendo que a) modificar tu API en función de lo que se está integrando con ella, y no puedes simplemente integrarte directamente con ella, b) hacer mucho más trabajo para crear una función adicional.
YAGNI . A menos que esté planeando específicamente escribir dos aplicaciones que funcionen de manera idéntica, una aplicación web y una aplicación de Windows, por ejemplo, es una gran cantidad de trabajo de desarrollo adicional.
La depuración es mucho más difícil cuando no puede avanzar de punta a punta.
Muchas operaciones independientes que requerirán muchos cambios de ida y vuelta, por ejemplo, algún código puede obtener el usuario actual, verificar que el usuario esté en el rol de administrador, obtener la compañía a la que pertenece el usuario, obtener una lista de otros miembros, enviarlos a todos un correo electrónico. Eso requeriría muchas llamadas a la API, o escribir un método a medida para la tarea específica que desea, donde el único beneficio de ese método a medida sería la velocidad, pero la desventaja sería que sería inflexible.
Probablemente hay algunas razones más por las que están en la parte superior de mi cabeza.
Simplemente me parece que a menos que realmente necesite dos aplicaciones idénticas, entonces realmente no vale la pena. Tampoco he visto una aplicación ASP.NET creada de esta manera, tendría que escribir dos aplicaciones separadas (la API y su código) y la versión también las controlará a ambas (si su página de usuario obtiene un nuevo campo, usted ' tendría que actualizar la API y su código de consumo simultáneamente para asegurar que no haya efectos nocivos o poner mucho trabajo extra para mantenerlo robusto).
Editar: Algunas respuestas geniales, realmente comienzan a tener una buena idea de lo que todo esto significa ahora. Entonces, para ampliar mi pregunta, ¿cómo estructuraría una aplicación MVC para seguir esta estructura API?
Por ejemplo, tiene un sitio web que muestra información sobre un usuario. Bajo MVC, tienes:
Ver: página HTML (CS) que muestra un controlador UserViewModel: llama a GetUser () y crea un UserViewModel que pasa a la clase View Manager (tipo de su API) que tiene un método GetUser.
El controlador hace GetUser () pero también quieres una aplicación de escritorio. Esto significa que su GetUser necesita ser expuesto a través de algún tipo de API. Es posible que desee una conexión TCP, WCF o quizás Remoting. También desea una aplicación móvil que sea RESTful ya que las conexiones persistentes son escamosas.
Entonces, ¿escribiría una API para cada uno, un servicio web WCF que tenga un método GetUser () y el código simplemente lo haga return new UserManager().GetUser()
? ¿Y un método mvc 4 web api que hace lo mismo? ¿Mientras continúa llamando a GetUser directamente en su método de controlador MVC?
¿O elegiría la solución que funcionaría para los tres (servicio REST de API web) y construiría todo sobre eso, de modo que las tres aplicaciones hagan llamadas API (las de mvc, a la máquina local)?
¿Y es solo un escenario teórico perfecto? Puedo ver grandes gastos generales en el desarrollo de esta manera, especialmente si tiene que desarrollar de una manera que le permita realizar operaciones de una manera RESTANTE. Creo que algo de esto ha sido cubierto en las respuestas.
Edición 2: después de leer más cosas, he puesto un comentario debajo que creo que podría explicarlo. La pregunta es un poco una pregunta capciosa, creo. Si escribiera su back-end como API, me confundió pensar que debería haber un solo servicio web que todo (aplicación de mvc, aplicación de escritorio, aplicación móvil) llame para hacer cosas.
La conclusión a la que he llegado es que lo que realmente debe hacer es asegurarse de que su capa de lógica de negocios esté correctamente desacoplada. Mirando mi código, ya hago esto: el controlador llamará GetUser()
a un administrador, luego creará un modelo de vista para representarlo con una Vista. Entonces, realmente, la capa de lógica de negocios es una API. Sin embargo, si desea llamarlo desde una aplicación de escritorio, deberá escribir algo como un servicio WCF para facilitar la llamada. Incluso tener un método WCF llamado GetUser()
que contenga el código return MyBusinessLayer.GetUser()
sería suficiente. Por lo tanto, la API es la lógica empresarial, y las API de WCF / web, etc., son solo titbits de código para permitir que las aplicaciones externas lo llamen.
Por lo tanto, hay algunos gastos generales, ya que debe envolver su capa de lógica de negocios en diferentes API dependiendo de lo que necesite, y tendrá que escribir un método de API para cada operación que desee que hagan sus otras aplicaciones, además tendrá que resuelva una forma de autenticación, pero en su mayor parte es lo mismo. Pegue su lógica de negocios en un proyecto separado (biblioteca de clases), ¡y probablemente no tendrá ningún problema!
Esperemos que esta interpretación sea correcta. Gracias por toda la discusión / comentarios que ha generado.