【问题标题】:ASP.NET and static method in controllerASP.NET 和控制器中的静态方法
【发布时间】:2017-07-12 11:06:37
【问题描述】:

假设 WebApi2 控制器有一个 SearchClient,它在启动时配置为 scoped-lifestyle 依赖项。

public class SearchController : ApiController {

    private readonly SearchClient _indexClient;

    public SearchController(SearchClient client) {
        _indexClient = client; // dependency injected
    }

    public IEnumerable<string> Get(string keyword){
        return SearchDocuments(_indexClient, keyword);
    }

    public static IEnumerable<string> SearchDocuments(SearchClient indexClient, string text)
    {
        return indexClient.Search(text);
    }
}

我们可以看到,SearchDocuments 方法有 static 关键字。

我的问题是;

  1. 我们如何判断static方法的好坏?
  2. static 方法在这样的多访问 Web 环境中是否安全或推荐使用?
  3. Web 环境中的async static 方法呢?和async方法有区别吗?

【问题讨论】:

  • 当它可以是实例而不需要参数时,为什么要将它设为静态并需要 SearchClient?但是,静态对于由控制器操作更改的属性是不安全的,对于方法或实际上是静态属性(不会更改)则不安全。
  • 那个静态方法没有真正的用途。假设SearchClient 不是抽象类,控制器应该依赖于抽象而不是具体化。
  • @CamiloTerevinto // 好吧,有时,Resharper 建议这样做。它允许将方法移动到另一个风险较小的类,这使得重构更容易。
  • Resharper 建议将实例方法(因为它使用实例数据)移动到静态方法?这很奇怪。我同意虽然离开课堂更容易
  • @Youngjae 因此依赖抽象的原因。

标签: c# asp.net-web-api static-methods


【解决方案1】:

我们如何判断静态方法的好坏?

Web 应用程序中的静态方法就像桌面应用程序中的静态方法一样。一旦它们在 Web 应用程序中运行,它们的处理或解释方式就没有区别。所以它们没有好坏之分,您可以将它们用于所有非实例特定的事物。

在这种多访问的网络环境中,静态方法是否安全或推荐使用?

static 字段或属性在存储用户或会话特定数据时可能会产生不良副作用,因为static 变量在会话之间共享。但这是一种方法,方法没有共享状态。因此,它们在多用户/多会话环境中使用是安全的。

Web 环境中的异步静态方法呢?它与异步方法有什么不同?

除了第一个问题的答案中已经描述的以外,没有其他内容。

【讨论】:

  • 我很高兴我对 101k 用户有同样的理解。 +1 给你确认我的小评论
  • 如果我不在这里花这么多时间,我可能只有 100 个声望……声望说明不了那么多。 @CamiloTerevinto
【解决方案2】:

只是为了补充已经提供的答案。

在控制器上使用静态方法并没有真正增加任何价值,在给定的场景中实际上也不需要。

考虑在控制器中抽象显式依赖项。

public class SearchController : ApiController {

    private readonly ISearchClient indexClient;

    public SearchController(ISearchClient client) {
        indexClient = client; // dependency injected
    }

    public IEnumerable<string> Get(string keyword){
        return indexClient.Search(keyword);
    }
}

这也将允许在测试和重构时实现松散耦合和更大的灵活性,因为依赖项的实现可以更改而无需接触控制器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2015-01-16
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    相关资源
    最近更新 更多