C# ASP.NET与控制器中的静态方法

C# ASP.NET与控制器中的静态方法,c#,asp.net-web-api,static-methods,C#,Asp.net Web Api,Static Methods,假设WebApi2控制器有一个SearchClient,它在启动时在作用域生活方式依赖项中配置 public class SearchController : ApiController { private readonly SearchClient _indexClient; public SearchController(SearchClient client) { _indexClient = client; // dependency injected

假设WebApi2控制器有一个
SearchClient
,它在启动时在作用域生活方式依赖项中配置

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);
    }
}
公共类SearchController:ApiController{
私有只读搜索客户端_indexClient;
公共SearchController(SearchClient客户端){
_indexClient=client;//注入依赖项
}
公共IEnumerable Get(字符串关键字){
返回SearchDocuments(_indexClient,关键字);
}
公共静态IEnumerable SearchDocuments(SearchClient indexClient,字符串文本)
{
返回indexClient.Search(文本);
}
}
正如我们所看到的,
SearchDocuments
方法具有
static
关键字

我的问题是,

  • 我们如何判断
    静态
    方法是好是坏
    
  • 在这样的多访问web环境中,
    静态
    方法是安全的还是推荐的
  • web环境中的
    异步静态
    方法怎么样?它与
    async
    方法不同吗
  • 我们如何判断静态方法是好是坏

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

    在这样的多访问web环境中,静态方法是安全的还是推荐的

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

    web环境中的异步静态方法怎么样?它与异步方法不同吗


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

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

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

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

    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);
        }
    }
    
    公共类SearchController:ApiController{
    私有只读ISearchClient indexClient;
    公共搜索控制器(ISearchClient客户端){
    indexClient=client;//注入依赖项
    }
    公共IEnumerable Get(字符串关键字){
    返回indexClient.Search(关键字);
    }
    }
    

    这还将允许在测试和重构时实现松散耦合和更大的灵活性,因为依赖关系的实现可以在不接触控制器的情况下更改。

    如果它可以是实例而不需要参数,为什么要将其设置为静态并需要SearchClient?但是,对于由控制器操作更改的属性,静态是不安全的,对于方法或实际的静态属性(不会更改),静态方法没有真正的用途。在单独的not上,控制器应该依赖于抽象而不是具体,假设
    SearchClient
    不是抽象类。@CamiloTerevinto//有时候,Resharper建议这样做。它允许将方法移动到另一个风险较小的类,这使得重构更容易。Resharper建议将实例方法(因为它使用实例数据)移动到静态方法?真奇怪。我同意搬出教室比较容易though@Youngjae这就是依赖抽象的原因。我很高兴我有101k用户的相同理解+感谢你确认我的小评论,如果我没有在这里花那么多时间,我可能只有100个名声。。。名声并不能说明什么@迷彩车
    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);
        }
    }