gpt4 book ai didi

asp.net-mvc - MVC 中公共(public) NonAction 方法的用途

转载 作者:行者123 更新时间:2023-12-03 23:53:28 32 4
gpt4 key购买 nike

我刚刚开始在 MVC 中工作,我有一个疑问。

而不是 Nonaction方法,我们可以在 Controller 中创建私有(private)方法,也可以在模型中编写方法并从 Controller 中调用。

那么,使用 public NonAction 的真正目的是什么? MVC 中的方法?

最佳答案

(我重组了答案以更好地解决评论中的问题)

我认为,该属性在这里只是为了更好的灵 active 。作为一名框架设计者,人们希望尽可能地放松对最终用户的编码约束。不公开不采取行动的要求“总的来说”听起来不错,但对于某些项目来说可能过于严格。添加 [NonAction]解决了他们的问题(尽管是由他们糟糕的设计引入的) - 显然您不会被迫使用该属性,因此从框架设计者的角度来看这是双赢的。

另一个原因可能是遗留问题——在早期的 MVC 版本中,只有方法标记为 [Action]。被视为行动的地方。因此,当他们放宽要求(并且所有公共(public)方法都被视为操作)时,他们保留了 [NonAction]这样开发人员就不会太困惑了。

一般来说,使用 NonAction是一种不好的做法-正是出于您所说的原因。如果某事不应该是一个 Action ,它不应该是 public首先。

Controller 上的公共(public)非操作方法的问题在于它们使人们很想实例化您的 Controller 并调用该方法,而不是分离出公共(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);
...
}
}

第一种方法导致 Controller 和 Action 中非直接代码之间的耦合增加。代码变得难以遵循和重构,并且难以模拟/测试。

除了增加耦合之外,任何公共(public)的非操作方法都是一个安全漏洞——如果你忘记用 [NonAction] 标记它(或者,更好的是,远离公共(public)) - 因为它被视为正常操作并且可以在外部调用。我知道最初的问题有点暗示你肯定不会忘记在需要时附加属性,但如果你愿意,了解会发生什么也很重要;)哦,好吧,当我们在这个问题上时,在我看来与“忘记将方法设为私有(private)”相比,“忘记属性”在理论上更有可能。

有时人们说有 public非 Action 对于单元测试是必要的,但同样,当某些东西不是 Action 时,它很可能可以被隔离在一个单独的类中并单独测试。此外,即使由于某种原因不可行,标记一个方法 public仅用于测试目的是一个坏习惯 - 使用 internalInternalsVisibleTo是推荐的方式。

关于asp.net-mvc - MVC 中公共(public) NonAction 方法的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17418037/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com