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 ключевое слово.

Мои вопросы

  1. Как мы можем решить, стоит ли static метод это хорошо или плохо?
  2. Является static метод безопасен или рекомендован в такой среде с множественным доступом?
  3. Как насчет 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);
    }
}

Это также обеспечит слабую связь и большую гибкость при тестировании, а также рефакторинг, поскольку реализация зависимости может изменяться без необходимости касаться контроллера.

Другие вопросы по тегам