2009-06-01 19 views
8

¿Alguien tiene consejos o consejos sobre el uso de un servicio web como modelo en una aplicación ASP.Net MVC? No he visto a nadie escribiendo sobre hacer esto. Me gustaría construir una aplicación MVC, pero no vincularla al uso de una base de datos específica, ni limitar la base de datos a la única aplicación MVC. Siento que un servicio web (RESTful, muy probablemente ADO.Net Data Services) es el camino a seguir.ASP.Net MVC con servicio web como modelo?

Respuesta

3

Editar 2010-11-27; Aclaró mis pensamientos, que realmente se necesitaba.

Un servicio web expone la funcionalidad a través de diferentes tipos de aplicaciones, no para la abstracción en una sola aplicación, la mayoría de las veces. Probablemente esté pensando más en una forma de encapsular comandos y lecturas de una manera que no interfiera con la programación de su controlador/vista.

Utilice un servicio de un bus de servicio si busca el desacoplamiento y realice un patrón asíncrono en sus páginas asíncronas. Puede ver Rhino.ServiceBus, nServiceBus y MassTransit para implementaciones nativas .Net y RabbitMQ para algo diferente http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/.

Editar: He tenido algo de tiempo para tratar de conecté de una manera que envió mensajes a mi servicio que a su vez impulsó las actualizaciones de la aplicación de libros. RabbitMQ es un intermediario de mensajes, también conocido como MOM (middleware orientado a mensajes) y puede usarlo para enviar mensajes a su servidor de aplicaciones.

También puede simplemente proporcionar interfaces de servicio. Lea el diseño impulsado por el dominio de Eric Evan para una descripción más detallada.

Las interfaces de servicio REST-ful tratan mucho con datos, y más específicamente con recursos direccionables. Puede simplificar en gran medida su modelo de programación y permite un gran control sobre la salida a través del protocolo HTTP. El próximo modelo de programación de WCF usa descanso verdadero tal como se define en la tesis original, donde cada documento debe, hasta cierto punto, proporcionar URI para una navegación continua. Tener un look at this. (En mi primera versión de esta publicación, lamenté REST por ser "lenta", sea lo que sea lo que signifique) Las API basadas en REST también son más o menos lo que usa CouchDB y Riak.

ADO.Net es bastante basura (!) [N + 1 problemas con la recolección diferida debido a código de implementación, pérdida de acceso a datos - siempre necesita su contexto db donde su código de consulta es etc.] en comparación con por ejemplo LightSpeed ​​(comercial) o NHibernate. Spring.Net también le permite envolver las interfaces de servicio en su contenedor con una fachada de servicio web, pero (sin haberlo navegado por un tiempo) creo que es demasiado xmly en su configuración.

Editar 1: con ADO.Net aquí me refiero a la "mejor práctica" predeterminada con DataSets, DataAdapter e iterar muchas filas de un DataReader; genera código bastante feo y difícil de depurar. Las cosas N + 1, sí, eso es sobre el marco de la entidad.

(Edición 2: ADO.NET Entity Framework no me impresiona, ya sea!)

Edición 1: Crear la capa de dominio en un ensamblado independiente [aka. Core] y proporciona todos los servicios de dominio y aplicaciones allí, luego importe este ensamblado desde su aplicación MVC específica. Envuelva el acceso a los datos en algún DAO/Repositorio, a través de una interfaz en su conjunto central, al que su conjunto de Datos haga referencia e implemente. Conecta la interfaz e implementación con IoC. Incluso puede programar algo para el descubrimiento de servicio dinámico con los buses de servicio mencionados anteriormente, para resolver las interfaces. WCF usa interfaces como esta y también la mayoría de los buses de servicio anteriores; puede proporcionar un resubcomponente en su contenedor IoC para hacerlo automáticamente.

Editar 2: Un gran combo para lo anterior sería CQRS + EventSourcing + ReactiveExtensions. Su modelo de escritura tomaría comandos, su modelo de dominio decidiría si los acepta o no, impulsaría eventos a la línea de extensiones reactivas, quizás también sobre RabbitMQ, que su modelo de lectura consumiría.

actualización 2010-01-02 (edit 1)

La broma de mi idea ha sido codificada por algo llamado MindTouch sueño. Han realizado un screencast donde tratan casi todas las partes de una aplicación web como un servicio (web), que también está expuesto con REST.

Han creado un marco altamente paralelo usando co-rutinas para manejar esto, incluyendo su propio grupo de hilos elásticos.

A todos los que dicen mal en esta pregunta, en su cara: p! Listen to this screen-cast, especialmente a los 12 minutos.

The actual framework is here.

Si usted está en este tipo de programación, echar un vistazo a how monads work y their implementations in C#. También puede leer en CoRoutines.

¡Feliz año nuevo!

actualización 2010-11-27 (edición 2)

Resultó corrutinas consiguió productizado con la biblioteca paralela tareas de Microsoft. Su tarea ahora implementa las mismas características, ya que implementa IAsyncResult. Caliburn es un marco genial que los usa.

Las extensiones reactivas llevaron la comprensión de las mónadas al siguiente nivel de asynchronocity.

El mundo de ALT.Net parece avanzar en la dirección de la que hablé cuando escribí esta respuesta la primera vez, aunque con nuevos tipos de arquitecturas de las que sabía poco.

+0

¿Está Comparando ADO.Net a ORM (párrafo 4)? ¿Quisiste decir LINQ2SQL o EF? – MotoWilliams

+0

Bueno, ORM usa ADO.Net; Estaba comparando el uso de cada uno de ellos como la interfaz principal de la base de datos, en cuyo caso tiene sentido. – Henrik

+0

N + 1 en ado.net? En serio ... Las colecciones con carga diferida solo causan N + 1 en ciertos escenarios que alcanzará con nhibernate. Es por eso que tiene una carga ansiosa por consulta a través de estrategias de búsqueda en cualquier ORM razonable que exista, incluido linq2sql. Como sucede, nhibernate está ejecutando ado.net debajo para su conexión db ... – SerialSeb

3

Debe definir sus modelos de manera independiente del acceso a los datos, p. usando el patrón Repositorio. Luego puede crear implementaciones concretas respaldadas por tecnologías específicas de acceso a datos (servicio web, SQL, etc.).

28

¿Cuán probable, o útil, es que su aplicación MVC se desacople de su base de datos? ¿Con qué frecuencia ha visto, en la vida útil de su aplicación, un cambio de SQL Server a Oracle? De los últimos 10 años de proyectos que he entregado, nunca sucedió.

Las arquitecturas son como las cebollas, tienen capas de abstracciones por encima de las cosas de las que dependen. Y si vas a usar un RDBMS para almacenamiento, eso es el núcleo de tu arquitectura. Resumir el DB para poder intercambiarlo es una falacia.

Ahora puede desacoplar el acceso a su base de datos de su dominio, y el patrón de repositorio es una de las formas de hacerlo. La mayoría de las soluciones maduras utilizan un ORM en estos días, por lo que es posible que desee echar un vistazo a NHibernate si desea una tecnología madura, o ActiveRecord/linq2sql para un patrón de registro activo más simple en la parte superior de sus datos.

Ahora que tiene su estrategia de datos en su lugar, tiene un dominio de algún tipo.Cuando expone datos a su cliente, puede elegir hacerlo a través de un patrón MVC, donde normalmente enviará DTO generados desde su dominio para el renderizado, o puede decidir aprovechar un estilo de arquitectura como REST para proporcionar sistemas más flexibles. , proporcionando enlaces y representaciones personalizadas.

Se pasa del acoplamiento ajustado al acoplamiento más flexible a medida que se avanza hacia las capas externas de la solución.

Si su pregunta, sin embargo, era construir una aplicación MVC sobre una arquitectura REST o servicios web, y usar eso como modelo ... ¿Por qué molestarse? Si va a tener un modelo de dominio, ¿por qué no reutilizarlo en su sistema y sus servicios donde tiene sentido?

Generar una interfaz de usuario desde una aplicación MVC y generar los documentos necesarios para una arquitectura RESTful son dos contextos completamente diferentes, basarse unos en otros va a causar mucho más dolor de lo necesario. Y estás sacrificando el rendimiento.

Depende de su escenario exacto, pero el servicio remoto basado en XML como el modelo en MVC, por experiencia, no es una buena idea, es probable que sea una sobreingeniería y sin tener en cuenta la necesidad de un dominio.

+0

Cada vez más, se requiere que las aplicaciones empresariales puedan usar una base de datos de cualquier proveedor, y su software debería poder hacerlo. Muchas empresas tienen licencias para Oracle, por ejemplo, pero ahora se inclinan por MySql. – Liao

+2

Exigir el cambio de bases de datos es una abstracción cara de imponer y un cambio costoso de realizar. Es uno de esos requisitos de arquitectura de astronautas que, cuando ocurre el cambio, aún cuesta tanto. Para la mayoría de los escenarios, uno está mucho mejor diseñando en una base de datos. Si se produce el requerimiento de un cambio, va a costar de todos modos, y argumentaré que puede costar mucho menos que el diseño para escenarios agnósticos de bases de datos. Incluso el uso de un ORM a la nhibernate, todavía se tendrá inconsistencias, incompatibilidades, clasificación, etc. variable de – SerialSeb

+2

"¿Qué tan probable, o útil, es que para su aplicación MVC para desacoplarse de la base de datos?" - No veo por qué cada otro afiche necesita decirle a la persona que hace la pregunta que están equivocados a menos que se ajuste a su modelo autoimpuesto de refutar las condiciones previas de la pregunta (que él plantea) en lugar de preguntarle al núcleo del pregunta en si! – Henrik

0

Realmente depende del tamaño de este proyecto mvc. Yo diría que mantengan la UI y el Dominio en el mismo entorno de ejecución si el sitio web va a ser utilizado por un pequeño número de usuarios (< 5000).

Por otro lado, si está planeando un sitio al que millones accederán, tiene que pensar distribuido y eso significa que necesita construir su sitio web de manera que pueda escalar hacia arriba o hacia afuera. Eso significa que es posible que necesite usar servidores adicionales (Web, aplicación y base de datos).

Para que esto funcione bien, debe desacoplar el sitio de interfaz de usuario de mvc de la aplicación. La capa de aplicación generalmente contendría su modelo de dominio y podría estar expuesta a través de WCF o un bus de servicio. Preferiría un bus de servicio porque es más confiable y podría usar colas persistentes como msmq.

Espero que esto ayude

Cuestiones relacionadas