2011-05-25 60 views

回答

36

基控制器類沒有什麼好用處。

現在聽我說。

Asp.Net MVC,尤其是MVC 3擁有噸的可擴展的鉤子提供更解耦的方式將功能添加到所有控制器。由於您的控制器類對於應用程序來說非常重要且非常重要,因此讓它們保持輕量,敏捷和鬆散耦合到其他所有方面非常重要。

  • 日誌基礎設施屬於一個 構造,並應通過DI框架注入 。

  • CRUD腳手架應由 代碼生成或自定義 ModelMetadata提供程序處理。

  • 全球的異常處理應該由定製ActionInvoker被 處理。

  • 全局視圖數據和授權 應該由作用的過濾器進行處理。 使用MVC3中的全局動作過濾器 更容易。

  • 常量可以去另一個類/文件名爲ApplicationConstants什麼的。

基地控制器通常使用由缺乏經驗的開發者MVC誰不知道所有MVC的不同擴展件。現在,請不要誤解我的意思,我不會評判並與那些因爲所有錯誤原因而使用它們的人一起工作。它的正義體驗爲您提供瞭解決常見問題的更多工具。

,我幾乎可以肯定沒有,你不能與其他可擴展性掛鉤不是一個基本的控制器類解決一個單一的問題。除非有明顯的生產力原因,並且不違反Liskov,否則不要採用最緊密的耦合形式(繼承)。我寧願花1秒鐘在public ILogger Logger { get; set; }之類的控制器上鍵入一次屬性20次,而不是引入緊密耦合,這會以更重要的方式影響應用程序。

即使像用戶標識或者多租戶鍵可以走了的ControllerFactory而不是基本控制器。基礎控制器類的耦合成本是不值得的。

+2

好了,我們可以做的事情,而不使用基本控制器。你能告訴使用基本控制器 – Tassadaque 2011-05-26 06:30:47

+6

@Tassadaque的一些缺點 - 聯軸器,聯軸器,聯軸器和耦合。 – jfar 2011-05-26 13:07:11

+29

我不相信。你更喜歡在所有的控制器中使用相同的代碼,而不是擁有一個基礎控制器,所以必須有這個優勢。你說優勢是「鬆散耦合」,但究竟是什麼意思,它解決了哪些問題,它除了解耦以外還有什麼其他問題? – Stijn 2013-02-13 13:18:49

3

我將其用於訪問會話,應用程序數據等

我也有保持之類的應用程序的名稱等的應用對象和我訪問從基類

基本上我使用它因爲我重複了很多事情

噢,我應該提到我不使用它的buisiness邏輯或數據庫訪問。我猜,常量對於基類來說是一個不錯的選擇。

2

根據我的經驗,大部分想要放在基本控制器中的邏輯理想情況下都會進入動作過濾器。 Action Filter只能用常量進行初始化,所以在某些情況下你不能這麼做。在某些情況下,您需要將操作應用於系統中的每個操作方法,在這種情況下,將您的邏輯放在基礎中而不是使用新的actionFilter屬性註釋每個操作方法會更有意義。

我還發現它有助於把屬性引用服務(否則從控制器分離)爲基礎,使它們易於訪問和持續初始化。

+2

ActionFilters只能用常量進行初始化並不是真的。常量的初始化是屬性的一個特性,而不是IActionFilter接口。您可以創建您的動作過濾器,然後將其分配給您的過濾器配置中的GlobalFilterCollection,或者無論您在何處處理此類事情。在您的過濾器中,您只需檢查是否存在您創建的單獨屬性,然後繼續使用過濾器的邏輯。 – crush 2015-06-19 19:53:14

1

我們使用BaseController兩件事情:應該適用於所有控制器

  1. 屬性。
  2. 重寫重定向,通過檢查重定向URL是否爲本地URL來防止重定向攻擊。這樣所有調用重定向的控制器都受到保護。
+0

你的第二點不是很清楚。如何覆蓋基本控制器中的重定向?會拿出一些例子,比如如何去做。如果可能的話,將教育我如何開放重定向攻擊發生以及如何通過示例阻止基類。謝謝 – Mou 2015-09-15 13:36:36

+0

1)可以用[全局註冊的過濾器](https://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx)代替。更好的是,自定義過濾器可以使用自定義屬性來有條件地排除它們(這將是重寫時在基礎控制器中維護的噩夢)。 2)這種孤立的邏輯可以放在Controller類的擴展方法中。無需到處繼承自定義的基本控制器(也不必擔心最終會在某處忘記這麼做)。 – NightOwl888 2016-06-01 16:30:45

0

我所做的是使用一個通用控制器基類來處理:

  • 我創建BaseCRUDController<Key,Model>這需要ICRUDService<TModel>對象作爲構造函數的參數,因此基類將處理創建/編輯/刪除。並確保在虛擬模式,自定義的情況下處理
  • ICRUDService<TModel>已經像保存/更新/方法刪除/查找/ResetChache/......我實現它爲我創建的每個存儲庫所以我可以添加更多的功能。
  • 採用這種結構我可以添加像PagedList一些一般功能/自動完成/ResetCache/IncOrder & DecOrder(如果模型IOrderable)
  • 錯誤/通知消息處理:在佈局一部分與@TempData["MHError"]代碼和類似

    PU在鹼控制器一個屬性blic通知錯誤 set {TempData [「MHError」] = value; } get {return(Notification)TempData。PEEK( 「MHError」); }}

有了這個抽象類,我可以很容易地處理方法,我不得不每次寫或代碼生成器創建。 但是這種方法也有弱點。

1

我使用了一個基本的控制器現在國際使用i18N庫。它提供了一種我可以用來本地化控制器內任何字符串的方法。

2

我已經在我的許多項目中使用的基本控制器和工作太棒了。我主要用於

  • 異常記錄
  • 通知(成功,錯誤增加..)
  • 調用HTTP404錯誤處理
+0

你會將我重定向到一些文章,比如如何通過基本控制器來處理你的情況。情況就像'異常日誌記錄,通知(成功,錯誤,添加..)和HTTP404錯誤處理'感謝 – Mou 2015-09-15 13:38:21

0

過濾器是不是線程安全,數據庫的訪問條件,依賴注入,數據庫連接在使用時可能會被其他線程關閉。