2015-12-18 64 views
4

我已經決定我的控制器變得雜亂無章,並決定採用像我在WebAPI項目中使用的管道式系統。管道包含的行爲越來越普遍,即:ViewAccountDetailsAction>AccountAction>AuthenticatedAction>EmptyAction。這些動作都以繼承的順序添加到pipleline,並公開成員,或針對不同場景公開成員或抽象方法。來自非控制器類的ActionResult

我的問題在於如何從管道元素返回視圖。在WebAPI示例中,返回一個IHttpActionResult並不需要執行任何視圖渲染,但是,需要MVC以不同的方式渲染其響應,並使用Razor的額外步驟。

由於控制器暴露internal protected輔助方法如View()RedirectToAction,我不能在控制器本身以外使用它們。

有沒有一種優雅的方式來呈現這些?我看到了一些方法來做到這一點,每個方法都很麻煩,或者給我帶來不舒服的感覺。

我目前最喜歡的方式是使基類隱藏受保護的方法,並使其成爲內部的同時調用基本方法。控制器實例將被提供給實例化的動作。這有什麼過錯嗎?我想不出有什麼可濫用的情況,但想看看社區是否就此事達成共識。

+1

旁註:「是必需的MVC來呈現不同的應對措施,剃刀的額外步驟」是有點虛假陳述有采取行動,甚至做任何事情(這可以通過看'的ActionResult很容易確認沒有任何要求。 ExecuteResult')...所以你可能會從你的陳述中得出不正確的結論。 –

+0

這聽起來像你可能正在體驗「胖控制器」反模式。仔細閱讀,然後可能會將代碼重構爲由瘦控制器調用的服務,並使用組合不繼承來實現結果。 –

+0

我已經把自己變成一種思想流派,其中控制器只需馬歇爾的RESTful/MVC路線,他們需要進行相應的操作。也許我需要縮小Action的範圍來返回一個POCO或內部對象,然後採取相應的行動,使用某種信號在控制器級產生正確的響應。我不知道這樣做會有多好,因爲只要結果已知,我寧願生成觀點。我還應該注意到,我正在使用Autofac來解決依賴關係,所以我有大量的請求範圍實例可以使用。 –

回答

1

我建議您採取進一步措施。

這花了一點研究,但我基於我爲Web客戶端2做了一個方法。基本上這個想法是我們創建了一個自定義ControllerSelector,ActionSelector和ActionDescriptors以及一個控制器基類,強類型的業務層。然後通過反射/自定義屬性,我們將調用整理到業務層,一般處理轉換爲HttpResponseResponse消息,包括錯誤。

  1. 控制器:http://pastebin.com/iK8ieBKD
  2. ControllerSelector:http://pastebin.com/qvEbggrP
  3. ActionSelector:http://pastebin.com/CEFNeKZZ

你需要做的第一件事就是看看: http://www.dotnet-tricks.com/Tutorial/mvc/LYHK270114-Detailed-ASP.NET-MVC-Pipeline.html

不幸的是ASP.NET MVC5的管道比Web API 2的管道靈活得多。但是你可以做三件事情:

  1. 自定義控制器廠:https://msdn.microsoft.com/en-us/library/system.web.mvc.icontrollerfactory(v=vs.118).aspx
  2. 定製ControllerDescriptor
  3. 定製ActionInvoker解譯ControllerDescriptor:https://msdn.microsoft.com/en-us/library/system.web.mvc.iactioninvoker(v=vs.118).aspx

這樣,你離開你的控制器做什麼控制器做得最好,併爲您的控制器創建一份合同,以便使用您的新管道進行一般解釋。這是真正做到這一點的正確方法。

高頂/ bastardizing如你所說,我不認爲控制器是一個偉大的計劃,這是一個更強大的解決方案,但它會採取顯著的努力。祝你好運!

+0

注:路由優先級邏輯是相當垃圾,我重構,在某些時候,因此只會解釋路由字符串(無需優先級排列),在某些時候這種變化得到了逆轉。 – JasonLind