假设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
个关键字。
我的问题是;
static
方法是好还是坏? static
方法是安全的还是推荐的? async static
方法怎么样?它与async
方法不同吗?答案 0 :(得分:3)
我们如何判断静态方法是好还是坏?
Web应用程序中的静态方法就像桌面应用程序中的静态方法一样。一旦在Web应用程序中运行,它们的处理方式或解释方式就没有区别。因此,它们并不坏或不好,您可以将它们用于非特定于实例的所有内容。
在这种多访问的Web环境中,静态方法是安全的还是推荐的?
static
字段或属性在用户或会话特定数据存储在其中时可能会产生不必要的副作用,因为会话之间共享static
个变量。但这是一种方法,方法没有共享状态。因此,它们可以安全地用于多用户/多会话环境。
Web环境中的异步静态方法怎么样?它与异步方法不同吗?
除了第一个问题的答案中已经描述过的内容之外没有其他内容。
答案 1 :(得分:0)
只是添加已经提供的答案。
在控制器上使用静态方法并没有真正添加任何值,在给定的场景中实际上并不需要。
考虑在控制器中抽象显式依赖项。
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);
}
}
这还可以在测试和重构时实现松散耦合和更大的灵活性,因为依赖项的实现可以在不必触摸控制器的情况下进行更改。