2017-07-12 4 views
2

Supposons que le contrôleur WebApi2 dispose d'un SearchClient configuré dans une dépendance de style de vie au démarrage.ASP.NET et méthode statique dans le contrôleur

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

Comme on le voit, la méthode SearchDocuments a static mot-clé.

Mes questions sont;

  1. Comment peut-on décider si la méthode static est bon ou mauvais?
  2. La méthode static est-elle sûre ou recommandée dans un tel environnement Web à accès multiples?
  3. Qu'en est-il de la méthode async static dans l'environnement Web? Est-ce différent de la méthode async?
+0

Pourquoi voudriez-vous le rendre statique et exiger un SearchClient quand il pourrait être instance et pas besoin du paramètre? Mais, statique n'est pas sûr pour les propriétés qui sont modifiées par les actions du contrôleur, pas pour les méthodes ou les propriétés réellement statiques (qui ne changent pas). –

+0

Cette méthode statique ne sert à rien. Sur un séparé, le contrôleur ne doit pas dépendre d'abstractions et non de concrétions, en supposant que SearchClient n'est pas une classe abstraite. – Nkosi

+0

@CamiloTerevinto // Eh bien, parfois, Resharper recommande de le faire. Et cela permet de déplacer la méthode vers une autre classe moins risquée ce qui facilite le refactoring. – Youngjae

Répondre

2

Comment pouvons-nous décider si la méthode statique est bonne ou mauvaise?

Les méthodes statiques dans les applications Web sont similaires aux méthodes statiques dans les applications de bureau. Il n'y a aucune différence dans la façon dont ils sont traités ou interprétés une fois qu'ils s'exécutent dans une application Web. Donc, ils ne sont pas mauvais ou bons, vous les utilisez pour tout ce qui n'est pas spécifique à l'instance.

La méthode statique est-elle sûre ou recommandée dans un tel environnement Web à accès multiples?

static champs ou propriétés peuvent avoir des effets secondaires indésirables lorsque les données spécifiques utilisateur ou de session est stocké dans static depuis variables sont partagées entre les sessions. Mais ceci est une méthode, et les méthodes n'ont pas d'état partagé. Par conséquent, ils sont sûrs à utiliser dans un environnement multi-utilisateur/multi-session.

Qu'en est-il de la méthode statique asynchrone dans l'environnement Web? Est-ce différent de la méthode asynchrone?

Rien d'autre que déjà décrit dans la réponse à votre première question.

+0

Je suis heureux d'avoir la même compréhension qu'un utilisateur 101k a. +1 à toi pour confirmer mon petit commentaire –

+1

J'aurais pu avoir juste 100 réputation si je ne passais pas tellement de temps ici ... La réputation ne dit pas tellement. @CamiloTerevinto –

0

Juste pour ajouter aux réponses déjà fournies.

L'utilisation de la méthode statique sur le contrôleur n'ajoute pas vraiment de valeur et n'est pas vraiment nécessaire dans le scénario donné. Envisagez d'abstraire les dépendances explicites dans le contrôleur.

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

Cela permettra également de couplage lâche et plus de flexibilité lors du test et aussi refactorisation que la mise en œuvre de la dépendance peut changer sans avoir à toucher le contrôleur.

+0

Merci pour la bonne recommandation. – Youngjae