2017-07-12 4 views
2

WebApi2コントローラの起動時にスコープライフスタイルの依存関係に設定されたSearchClientがあるとします。コントローラのASP.NETと静的メソッド

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. このような複数アクセスのWeb環境では、staticメソッドは安全か推奨ですか?
  3. ウェブ環境でasync staticメソッドはどうなりますか? asyncメソッドとは違いますか?
+0

なぜ静的にして、インスタンスになる可能性があり、パラメータが不要な場合にSearchClientが必要なのでしょうか?しかし、メソッドや実際には変更されない静的なプロパティではなく、コントローラのアクションによって変更されるプロパティに対しては、staticは安全ではありません。 –

+0

その静的メソッドは本当の目的を果たしません。分離していない場合、 'SearchClient'が抽象クラスでないと仮定して、コントローラは抽象度に依存し、concretionに依存しません。 – Nkosi

+0

@CamiloTerevinto //まあ、時々、Resharperはそれを作ることを勧めます。また、メソッドを別のクラスに移動することで、リファクタリングを簡単にすることができます。 – Youngjae

答えて

2

静的メソッドが良いか悪いかをどのように判断できますか?

Webアプリケーションの静的メソッドは、デスクトップアプリケーションの静的メソッドとまったく同じです。それらがWebアプリケーションで実行されると、処理や解釈の方法に違いはありません。だから彼らは悪くないか良いことではなく、あなたはインスタンス固有でないすべてのものに使います。

このような複数アクセスのWeb環境で静的メソッドが安全か推奨されていますか?

staticフィールドまたは特性がstatic変数はセッション間で共有されるので、ユーザまたはセッション固有のデータがそこに格納されている望ましくない副作用を有することができます。しかしこれはメソッドであり、メソッドは共有状態を持たない。したがって、マルチユーザー/マルチセッション環境での使用は安全です。

ウェブ環境での非同期スタティックメソッドはどうですか?非同期メソッドとは違いますか?

あなたの最初の質問に対する答えには既に説明されている以外の何もありません。

+0

私は101kユーザーと同じ理解を持っていることをうれしく思っています。私の小さなコメントを確認するためにあなたに+1 –

+1

私はここにあまり時間を費やさなかったならば、私はちょうど100の評判を持っていた可能性があります...評判はそんなに言わないでください。 @CamiloTerevinto –

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

また、これは、疎結合とテストとも依存の実装としてリファクタリングするコントローラをタッチすることなく変更することができ、より多くの柔軟性を可能にします。

+0

良い推薦をいただきありがとうございます。 – Youngjae

関連する問題