2008-09-23 57 views
8

雖然我的問題可能看起來很抽象,但我希望它不是。假設我開發了一個應用程序,一個ASP.NET MVC站點,後來我的任務是爲這個應用程序構建一個Winforms客戶端多少,以及如何從現有的應用程序中重用?重用MVC架構;有兩層UI:ASP.NET MVC和.NET Winforms

我定義了模型,我定義了控制器和視圖。他們都運作良好。

現在,老闆來了一個WinForms客戶端,我希望我可以重用模型和控制器(只要我把它們放在不同的程序集中),而不是隻重用視圖(ASPX視圖)。

可以這樣做嗎?怎麼樣?

回答

10

我以前做過這個,不是用asp.net MVC,而是用純asp.net web表單。我使用了本土MVP(Model-View-Presenter)模式,並且允許在WinForms應用程序中使用Presenter(==控制器)的絕對最重要的事情是不要參考要做的任何事情與system.web

所以你需要做的第一件事是介紹接口(s)來包裝任何請求,響應,web等東西,並讓每個演示者通過依賴注入接受這些接口(或使它們可用演示者通過其他技術),然後如果演示者使用這些而不是實際的system.web內容。

例子:

想象一下,你想轉讓從網頁A到網頁B的控制(在你的WinForms應用程序你可能要關閉形成一個再打開表格B)。

接口:

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

Web實現:

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

的WinForms實現:

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

現在演示(控制器在你的情況下):

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

我沒有詳細看過asp.net MVC實現,但我希望這給你一些指示,它可能會是很多工作,以啓用你以後的場景。

您可能想要考慮接受您將不得不爲不同平臺重新編寫視圖和控制器的代碼,而是專注於保持您的控制器非常精簡併將大部分代碼放入服務層被分享。

祝你好運!

+1

我希望我可以投你兩次,這是一個很好的答案! – 2009-07-15 13:33:06

2

看看Northwind starter kit(不要被Northwind bit拖延) - 它有各種GUI連接到分層架構,包括MVC和Winforms。

它正是你想要達到的。