2010-03-25 48 views
1

我想讓我的具體類與我的觀點分開。沒有使用強類型視圖,我很好。我只是在控制器方法簽名中使用一個大參數列表,然後使用我的服務層工廠方法創建我的具體對象。ASP.NET MVC 2 - 如何使用界面作爲強類型視圖的類型

這實際上對我來說很好,但是讓我思考並且在一點玩法之後,我意識到控制器方法接受接口作爲方法參數是不可能的 - 因爲它沒有辦法實例化它。無法通過IDE使用接口創建強類型視圖(實際上這很有意義)。

所以我的問題。有沒有辦法告訴控制器如何使用我的服務層工廠方法實例化接口參數?

我想從轉換:

[Authorize] 
[AcceptVerbs(HttpVerbs.Post)] 
[UrlRoute(Path = "Application/Edit/{id}")] 
public ActionResult Edit(String id, String TypeCode, String TimeCode, String[] SelectedSchoolSystems, 
      String PositionChoice1, String PositionChoice2, String PositionChoice3, String Reason, String LocationPreference, 
      String AvailableDate, String RecipientsNotSelected, String RecipientsSelected) { 

    //New blank app 
    IApplication _application = ApplicationService.GetById(id); 

喜歡的東西

[Authorize] 
[AcceptVerbs(HttpVerbs.Post)] 
[UrlRoute(Path = "Application/Edit/{id}")] 
public ActionResult Edit(String id, IApplication app) { 

      //Don't need to do this anymore 
      //IApplication _application = ApplicationService.GetById(id); 
+0

感謝您的優秀投入。巨大的幫助。 – Rake36 2010-03-26 00:01:10

+0

這已經很多個月了,但是經過很多編碼 - 我意識到即使自定義模型綁定可能是正確的答案,但使用強類型視圖模型對我來說是最好的。關鍵是View Model與我的數據庫對象相比經常不同。 – Rake36 2010-07-13 20:27:38

回答

2

您需要的視圖模型層。

使用接口抽象出業務層實體可能是有意義的,但抽象Web應用程序特定實體(大多數情況下我猜)沒有多大意義。這將允許您針對實現進行編碼。

嘗試從窗體綁定實體而不訪問數據庫也會帶來很多麻煩。

+0

也許我混淆了架構不當,但我已經有一個數據訪問層和一個服務層 - 所以我把MVC網站作爲表示層,我不想創建只是副本的視圖模型我的數據圖層類。我誤以爲接口應該足夠好嗎? – Rake36 2010-03-25 12:45:39

+0

@ Rake36在某些情況下可能就足夠了。它總是依賴於上下文。我只是說,添加適當的視圖模型可以輕鬆解決這個特定的問題(但會增加視圖模型和映射邏輯的代碼庫)。 – 2010-03-25 13:31:49

+0

@ Rake36你可能會發現這篇文章很有用 - http://bit.ly/9Bxpfj我猜 - '外部耦合'是什麼讓你的情況麻煩。 – 2010-03-25 13:45:54

1

自定義模型綁定。只需讓模型綁定器構建派生類的實例並將其作爲接口返回。

另一方面,爲什麼?通常,您將視圖和控制器參數都使用特定於視圖的模型。每個視圖/動作都有特定的模型需求。我可以理解你爲什麼想從一個通用的接口或抽象類中派生它們 - 例如,你的母版頁有一套可以使用的通用信息,但爲什麼特定的動作需要接收數據作爲抽象?難道它不知道它需要的數據類型,只是使用正確的派生類作爲參數類型?

+0

控制器不知道要使用哪個派生類。只有服務層。我曾想過也許我可以繼續創建視圖特定的模型,然後將這些模型用作服務層方法的參數。我試圖避免在視圖模型和具體類之間進行任何映射。那有意義嗎? – Rake36 2010-03-25 12:53:58

+0

我明白你在說什麼,但我認爲你走錯了路。我發現當你有視圖模型和數據模型時,事情會變得更好。總而言之,我發現我需要用視圖的其他數據來擴充我的數據模型,並將其封裝在視圖特定的模型中似乎是最好的方法。 – tvanfosson 2010-03-25 13:26:24

+0

謝謝。我將嘗試這個想法以及自定義模型綁定方法。我會在這裏回覆我的結果。 – Rake36 2010-03-25 23:45:27

1

你可以寫一個自定義模型粘結劑,將實例化一個正確類型:

public class MyModelBinder: DefaultModelBinder 
{ 
    protected override object CreateModel(
     ControllerContext controllerContext, 
     ModelBindingContext bindingContext, 
     Type modelType 
    ) 
    { 
     return // ... instantiate your model here 
    } 
} 

然後:

public ActionResult Edit(
    string id, 
    [ModelBinder(typeof(MyModelBinder))] IApplication app 
) 
{ 
    ... 
} 
+0

到目前爲止,我還沒有看過定製模型粘合劑。感謝這個例子。 – Rake36 2010-03-25 12:47:36