ASP.NET и статический метод в контроллере
Предположим, что контроллер 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);
}
}
Как мы можем видеть, SearchDocuments
метод имеет static
ключевое слово.
Мои вопросы
- Как мы можем решить, стоит ли
static
метод это хорошо или плохо? - Является
static
метод безопасен или рекомендован в такой среде с множественным доступом? - Как насчет
async static
метод в веб-среде? Это отличается отasync
метод?
2 ответа
Как мы можем решить, является ли статический метод хорошим или плохим?
Статические методы в веб-приложениях аналогичны статическим методам в настольных приложениях. Нет разницы в том, как они обрабатываются или интерпретируются после запуска в веб-приложении. Так что они не плохие или хорошие, вы используете их для всего, что не зависит от конкретного экземпляра.
Является ли статический метод безопасным или рекомендуемым в такой веб-среде с множественным доступом?
static
поля или свойства могут иметь нежелательные побочные эффекты, когда в них хранятся данные, специфичные для пользователя или сеанса, поскольку static
переменные распределяются между сессиями. Но это метод, а методы не имеют общего состояния. Следовательно, они безопасны для использования в многопользовательской / многосессионной среде.
А как насчет асинхронного статического метода в веб-среде? Это отличается от асинхронного метода?
Ничего, кроме уже описанного в ответе на ваш первый вопрос.
Просто чтобы добавить к уже предоставленным ответам.
Использование статического метода на контроллере на самом деле не добавляет никакой ценности и фактически не требуется в данном сценарии.
Рассмотрите возможность абстрагирования явных зависимостей в контроллере.
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);
}
}
Это также обеспечит слабую связь и большую гибкость при тестировании, а также рефакторинг, поскольку реализация зависимости может изменяться без необходимости касаться контроллера.