2008-09-23 7 views
8

Aunque mi pregunta puede parecer abstracta, espero que no lo sea. Supongamos que desarrollo una aplicación, un sitio ASP.NET MVC y luego me encargo de crear un cliente de Winforms para esta aplicación, ¿cuánto y cómo puedo reutilizarlo desde la aplicación existente?Reutilización MVC arhitecture; Tener dos capas de UI: ASP.NET MVC y .NET Winforms

Definí los modelos, definí los controladores y las vistas. Todos ellos funcionan bien.

Ahora el jefe viene a pedir un cliente de Winforms y espero poder reutilizar los modelos y los controladores (siempre que los coloque en diferentes ensamblajes) y no vuelva a utilizar solo las vistas (vistas ASPX).

¿Se puede hacer esto? ¿Cómo?

Respuesta

10

He hecho esto anteriormente, no con asp.net MVC pero con formularios web asp.net puros. Usé un patrón MVP (Model-View-Presenter) de fabricación casera, y lo más importante para permitir que el Presentador (== Controlador en su caso) para ser utilizado en una aplicación WinForms fuera no hacer referencia cualquier cosa para hacer con system.web

Por lo tanto, lo primero que debe hacer es introducir interfaces para envolver cualquier solicitud, respuesta, etc., y que cada Presentador acepte estas interfaces mediante Dependency Injection (o ponerlas a disposición del Presentadores por alguna otra técnica), entonces si el presentador usa esos en lugar de las cosas reales del sistema.

Ejemplo:

Imagine que desea transferir el control de una página A a la página B (que en su aplicación WinForms es posible que desee cerrar formar un formulario y luego abierta B).

Interfaz:

public interface IRuntimeContext 
{ 
    void TransferTo(string destination); 
} 

aplicación web:

public class AspNetRuntimeContext 
{ 
    public void TransferTo(string destination) 
    { 
    Response.Redirect(destination); 
    } 
} 

winforms aplicación:

public class WinformsRuntimeContext 
{ 
    public void TransferTo(string destination) 
    { 
    var r = GetFormByName(destination); 
    r.Show(); 
    } 
} 

Ahora el Presentador (Controlador en su caso):

public class SomePresenter 
{ 
    private readonly runtimeContext; 
    public SomePresenter(IRuntimeContext runtimeContext) 
    { 
    this.runtimeContext = runtimeContext; 
    } 

    public void SomeAction() 
    { 
    // do some work 

    // then transfer control to another page/form 
    runtimeContext.TransferTo("somewhereElse"); 
    } 
} 

No he examinado la implementación de asp.net MVC en detalle, pero espero que esto te dé una indicación de que probablemente sea mucho trabajo para habilitar el escenario que estás buscando.

En su lugar, puede considerar aceptar que tendrá que volver a codificar la Vista y el Controlador para las diferentes plataformas y concentrarse en mantener sus controladores extremadamente delgados y colocar la mayor parte de su código en una capa de servicio que pueda ser compartido.

¡Buena suerte!

+1

¡Desearía poder votar dos veces, esta es una gran respuesta! –

2

Eche un vistazo a Northwind starter kit (no se deje intimidar por el bit Northwind), que tiene varias GUI conectadas a una arquitectura en capas que incluye tanto MVC como Winforms.

Hace exactamente lo que quiere lograr.