MVC 中公共 NonAction 方法的用途
我剛剛開始在 MVC 中工作,我有一個疑問。
除了
Nonaction方法,我們可以在控制器中創建私有方法,或者我們也可以在模型中編寫方法並從控制器中呼叫它。
NonAction那麼,在 MVC中使用公共方法的真正目的是什麼?
(我重組了答案以更好地解決評論中的問題)
我認為,該屬性在這裡只是為了更好的靈活性。作為一名框架設計者,人們希望盡可能地放鬆對最終使用者的編碼約束。不公開不採取行動的要求“總的來說”聽起來不錯,但對於某些項目來說可能過於嚴格。添加
[NonAction]解決了他們的問題(雖然是由他們糟糕的設計引入的) - 顯然您不會被迫使用該屬性,因此從框架設計者的角度來看這是雙贏的。另一個原因可能是遺留問題——在早期的 MVC 版本中,只有帶有標記的方法
[Action]被視為操作。因此,當他們放寬要求(並且所有公共方法都被視為操作)時,他們保留了這些要求,[NonAction]以便開發人員不會太困惑。通常,使用
NonAction是一種不好的做法-正是出於您所說的原因。如果某件事不應該是一個動作,那麼它public首先就不應該是一個動作。控制器上的公共非操作方法的問題在於它們使人們很想實例化您的控制器並呼叫該方法,而不是分離出公共邏輯:
比較
public class MyController : IController { public ActionResult Foo(long orderId) { var order = new OrdersController().GetOrder(orderId); //GetOrder is public ... } }和
public class MyController : IController { public ActionResult Foo(long orderId) { var order = _orderService.GetOrder(orderId); ... } }第一種方法導致控制器和動作中非直接程式碼之間的耦合增加。程式碼變得難以遵循和重構,並且難以模擬/測試。
除了增加耦合之外,任何公共的非操作方法都是一個安全漏洞——如果你忘記用
[NonAction](或者,更好的是,改變遠離公共的)來標記它——因為它被視為正常操作並且可以在外部呼叫。我知道最初的問題有點暗示你肯定不會忘記在需要時附加屬性,但如果你願意,了解會發生什麼也很重要;)哦,好吧,當我們在這個問題上時,在我看來與“忘記將方法設為私有”相比,“忘記屬性”在理論上更有可能。有時人們說
public單元測試需要非動作,但同樣,當某些東西不是動作時,它很可能可以隔離在一個單獨的類中並單獨測試。此外,即使出於某種原因不可行,標記public僅用於測試目的的方法也是一種壞習慣 - 使用internal並且InternalsVisibleTo是推薦的方法。