ASP.NET 和控制器中的静态方法

ASP.NET and static method in controller

假设 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 方法在这样的多访问网络环境中安全或推荐吗?
  3. Web 环境中的async static 方法呢?它与 async 方法不同吗?

How can we decide whether static method is good or bad?

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

Is static method safe or recommended in such a multiple-accessed web environment?

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

What about async static method in web environment? Is it different from async method?

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

只是添加到已经提供的答案中。

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

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

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);
    }
}

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