我已經決定我的控制器變得雜亂無章,並決定採用像我在WebAPI項目中使用的管道式系統。管道包含的行爲越來越普遍,即:ViewAccountDetailsAction
>AccountAction
>AuthenticatedAction
>EmptyAction
。這些動作都以繼承的順序添加到pipleline,並公開成員,或針對不同場景公開成員或抽象方法。來自非控制器類的ActionResult
我的問題在於如何從管道元素返回視圖。在WebAPI示例中,返回一個IHttpActionResult
並不需要執行任何視圖渲染,但是,需要MVC以不同的方式渲染其響應,並使用Razor的額外步驟。
由於控制器暴露internal protected
輔助方法如View()
或RedirectToAction
,我不能在控制器本身以外使用它們。
有沒有一種優雅的方式來呈現這些?我看到了一些方法來做到這一點,每個方法都很麻煩,或者給我帶來不舒服的感覺。
我目前最喜歡的方式是使基類隱藏受保護的方法,並使其成爲內部的同時調用基本方法。控制器實例將被提供給實例化的動作。這有什麼過錯嗎?我想不出有什麼可濫用的情況,但想看看社區是否就此事達成共識。
旁註:「是必需的MVC來呈現不同的應對措施,剃刀的額外步驟」是有點虛假陳述有采取行動,甚至做任何事情(這可以通過看'的ActionResult很容易確認沒有任何要求。 ExecuteResult')...所以你可能會從你的陳述中得出不正確的結論。 –
這聽起來像你可能正在體驗「胖控制器」反模式。仔細閱讀,然後可能會將代碼重構爲由瘦控制器調用的服務,並使用組合不繼承來實現結果。 –
我已經把自己變成一種思想流派,其中控制器只需馬歇爾的RESTful/MVC路線,他們需要進行相應的操作。也許我需要縮小Action的範圍來返回一個POCO或內部對象,然後採取相應的行動,使用某種信號在控制器級產生正確的響應。我不知道這樣做會有多好,因爲只要結果已知,我寧願生成觀點。我還應該注意到,我正在使用Autofac來解決依賴關係,所以我有大量的請求範圍實例可以使用。 –