2008-09-23 10 views
8

Obwohl meine Frage abstrakt scheint, hoffe ich, dass es nicht ist. Angenommen, ich entwickle eine Anwendung, eine ASP.NET MVC-Site und später bin ich beauftragt, einen Winforms-Client für diese Anwendung zu erstellen, wie viel und wie kann ich aus der vorhandenen Anwendung wiederverwenden?Wiederverwendung von MVC-Architektur; Habe zwei UI-Ebenen: ASP.NET MVC und .NET Winforms

Ich definierte die Modelle, ich definierte Controller und Ansichten. Sie alle funktionieren gut.

Jetzt fragt der Chef nach einem Winforms-Client und ich hoffe, dass ich die Modelle und die Controller wiederverwenden kann (sofern ich sie in verschiedene Assemblies setze) und nicht nur die Ansichten (ASPX-Ansichten) wiederverwende.

Kann dies getan werden? Wie?

Antwort

10

Ich habe dies zuvor getan, nicht mit asp.net MVC, sondern mit reinen asp.net Web Forms. Ich habe ein selbstgewähltes MVP-Modell (Model-View-Presenter) verwendet, und die absolut wichtigste Sache, damit der Presenter (== Controller in Ihrem Fall) in einer WinForms-App verwendet werden konnte, war nicht irgendetwas zu tun mit system.web

Also die erste Sache, die Sie tun müssen, ist einzuführen Schnittstelle (n) zu wickeln jede Anfrage, Antwort, Web etc Sachen, und jeder Presenter akzeptieren diese Schnittstellen über Dependency Injection (oder stellen Sie sie zur Verfügung Moderatoren durch eine andere Technik), dann, wenn der Presenter diese eher als die eigentlichen system.web Zeug verwendet.

Beispiel:

Stellen Sie die Kontrolle übertragen von Seite A auf Seite B wollen (die in Ihrer WinForms-Anwendung Sie schließen möchten vielleicht ein B dann offene Form bilden).

Schnittstelle:

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

Web-Implementierung:

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

winforms Umsetzung:

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

Jetzt ist der Presenter (Controller in Ihrem Fall):

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"); 
    } 
} 

Ich habe die asp.net MVC-Implementierung nicht im Detail untersucht, aber ich hoffe, dies gibt Ihnen einige Hinweise, dass es wahrscheinlich eine Menge Arbeit sein wird, um das Szenario, das Sie suchen, zu ermöglichen.

Sie können stattdessen akzeptieren, dass Sie die Ansicht und den Controller für die verschiedenen Plattformen neu codieren müssen und sich stattdessen darauf konzentrieren, Ihre Controller extrem dünn zu halten und den Großteil Ihres Codes in eine Serviceebene zu integrieren Geteilt werden.

Viel Glück!

+1

Ich wünschte, ich könnte Sie zweimal wählen, das ist eine großartige Antwort! –

2

Werfen Sie einen Blick auf die Northwind starter kit (lassen Sie sich nicht von der Northwind Bit) - das hat verschiedene GUIs an eine geschichtete Architektur einschließlich MVC und Winforms.

Es tut genau das, was Sie erreichen möchten.