2012-03-15 9 views
14

¿Qué arquitectura y patrones puedo usar para compartir la mayoría del modelo y el código lógico entre un WPF y una aplicación ASP.NET MVC?¿Cómo compartir la mayor cantidad de código entre un WPF y una aplicación ASP.NET MVC?

Estoy tratando de lograr un poco más aquí que solo separar mis entidades de datos de los dos proyectos de presentación. Hay mucho más en común, p. La lógica de la interfaz de usuario en qué se muestra bajo qué condiciones, cuándo se requiere algo, etc. que me gustaría conservar en el código compartido.

AGREGADO: Estoy empezando a apreciar el concepto de ver modelos independientemente de mi modelo de entidad que impulsa mi presentación. Si bien algunas de las anotaciones utilizadas en estos se encuentran en ensamblajes específicos de MVC, ninguno de los metadatos proporcionados es en realidad específico de la web. Me gustaría explorar usando mis modelos de vista de MVC como fuentes de datos para enlazar a las vistas de WPF. Cualquier sugerencia en este frente será muy apreciada.

+0

He hecho una pregunta similar [aquí] (https://stackoverflow.com/questions/44528570/should-viewmodel-deal-directly-with-dto-or-it-is-ok-to-have-intermediate-clientm) ¿Tuvo éxito reutilizando ViewModels? – Tenek

Respuesta

6

Mi configuración favorita es similar a la de Adán King sugirió arriba, pero me gusta mantener la DLL lógica como parte del proyecto web. Ejecuto un proyecto llamado CT Terminal que sigue este patrón. Mi proyecto Terminal.Domain contiene toda la lógica de la aplicación y simplemente devuelve un objeto CommandResult con propiedades que actúan como instrucciones para decirle al proyecto de UI qué hacer. La interfaz de usuario es completamente tonta y solo procesa lo que el proyecto del Dominio le dice.

Ahora, siguiendo el enfoque de Adam King, le daría una bofetada a esa DLL de dominio en una aplicación WPF y luego codificaría la interfaz de usuario para seguir las instrucciones en mi objeto devuelto CommandResult. Sin embargo, prefiero un enfoque diferente. Escribí la interfaz de usuario MVC 3 para exponer una API JSON. Esta API puede ser consumida por cualquier aplicación. La API JSON era simple porque básicamente era un contenedor alrededor de mi proyecto Terminal.Domain CommandResult objeto. El JSON devuelto tendría las mismas propiedades básicas. De esta manera, escribiría la aplicación WPF para consumir esta API en lugar de la DLL. Ahora, si realizo pequeños cambios en la lógica interna de la aplicación, simplemente despliegue el proyecto web en el servidor activo. Todos los clientes que utilizan la API obtienen automáticamente esta nueva lógica.

Obviamente, si los cambios que se realizan afectan a las propiedades devueltas de la API, entonces eso requeriría un lanzamiento de un nuevo código de cliente, pero al menos para la lógica interna no tendría que hacer eso.

+1

Me gusta este enfoque. Ofrece más que solo compartir entidades de datos entre los diferentes proyectos de presentación. – ProfK

+0

El enlace "CT Terminal" ya no funciona. – Tenek

+0

Lo siento, no estoy seguro de qué pasó con ese proyecto, pero el concepto se duplicó en un proyecto node.js más nuevo llamado [shotgun] (https://github.com/chevex-archived/shotgun). En lugar de una biblioteca de clase, es un módulo de nodo. – Chev

2

De hecho, me parecieron muy útiles los libros, el software y los videos de Rocky Lhotka sobre este tema. He aquí algunos enlaces a su contenido:

http://www.lhotka.net/

http://channel9.msdn.com/Events/Speakers/Rockford-Lhotka

http://www.amazon.com/Expert-C-2008-Business-Objects/dp/1430210192/ref=sr_1_2?s=books&ie=UTF8&qid=1331834548&sr=1-2

+3

¿qué se aplica específicamente a la pregunta hecha aquí? –

+0

Rocky tiene una biblioteca .NET para modelos y modelos de visualización que funciona bastante bien. Creo que su diseño, como se explica en sus videos, se presta a un código muy reutilizable. Habla sobre el modelo de propiedad DependencyObject de WPF e implementa algo similar en su biblioteca. Creo que es una característica útil para llevar a MSMVC. – Brannon

+0

Solo un aparte: Lhotka's * Professional VB6 Business Objects * fue la biblia en la que fundé mi carrera como desarrollador independiente. – ProfK

3

Uno de los patrones más utilizados parece estar teniendo las entidades en un conjunto de DLL independiente, y luego tener esta referencia de cada uno de los otros proyectos.

MVC 3 trajes del patrón repositorio muy bien, que puede ser una ruta limpia para tomar, en primera instancia, y trabajará tanto para WPF y ASP.net

1

Cree una capa de servicio para su aplicación especificando interfaces con métodos que representen todas las operaciones que necesita realizar. Además, en esta capa de servicio, defina todos los tipos de datos utilizados por la aplicación. Esas clases de tipos de datos deben contener solo propiedades, no operaciones. Coloque estas interfaces y clases en un ensamble por sí mismo. Este conjunto debe compartirse entre su aplicación web, la aplicación WPF y el código que la implementa.

Finalmente, una vez que tenga esta separación, puede desarrollar libremente la estructura interna de la aplicación y dejar la responsabilidad de las operaciones de la interfaz de usuario (por ejemplo, lo que sucede al hacer clic en el botón xyz) en la interfaz de usuario respectiva.

Como un lado, puede exponer su capa de servicio, a través de WCF y servicios web. Puede usar esto para hacer una llamada desde el navegador web a través de javascript. Puede hacer cosas como la validación del lado del cliente o incluso buscar valores sobre la marcha para la población desplegable. todo mientras lo reutilizas entre tus dos aplicaciones.

1

Comenzando con lo obvio. Encapsule su lógica comercial y modelo de dominio en un ensamblaje por separado.

En términos de capas de presentación y comportamiento compartido de la interfaz de usuario, lo más cercano que obtendrá es el paradigma de diseño MVVM, la implementación será C# en WPF/XAML y Javascript para su interfaz web ASP.NET MVC.

Para la interfaz web puede acercarse a la forma de hacer WPF (MVVM) con http://knockoutjs.com/ escrita por Steve Sanderson de Microsoft. Su MVVM para el navegador. También pago http://www.asp.net/mvc/mvc4 para más información.

1

Use Web Api, permita que tanto WPF como la aplicación Web consuman los servicios de Web Api. Hecho.

+0

Me gusta este enfoque, parece tan simple y elegante, pero ¿cómo compartir las principales entidades del modelo de datos a la aplicación WPF, especialmente si desea aplicar la validación y la serialización con anotaciones y atributos de datos? ¿Tengo que redefinir las clases modelo específicamente para cada plataforma? esto parece casi anular todo el beneficio de usar WebAPI ya que tendré que mantener sincronizados los modelos en las diferentes plataformas ... – SelAromDotNet

1

Intentaste usar Portable class libraries. Con esto puedes crear la capa de datos y usarla en ASP.Net MVC, WPF, Windows Phone, Silverlight.

+0

¿Puede usted (o cualquier otra persona que lea esto) señalar cualquier recurso que analice específicamente el uso de bibliotecas de clases portátiles para apunte tanto a la Web como a Win8/WinPhone/WPF? Me gusta la sugerencia de NPehrsson de usar WebAPI para alimentar desde la web a otras plataformas, ¡y agradecería cualquier información adicional sobre mis comentarios allí! ¡muchas gracias! – SelAromDotNet

Cuestiones relacionadas