2017-11-02 11 views
3

謝罪これまでに質問/回答されていた場合は、このトピックに関する検索で実際に私の仕事に直接関係しない膨大な種類の話題につながっています。コンストラクタのテンプレートリファクタリングDI

現在、Ninjectを使用してコンストラクタインジェクションをサポートするために、内部コードベース内で大量のコンストラクタをリファクタリングするという目標を達成する必要があります。 StaticKernelReferenceが、これは同様にアンチパターンと考えられている(私は承知していますNinject StandardKernelの静的インスタンスへの参照です

IRequiredService => StaticKernelReference.Get<IRequiredService>(); 

:現在、我々はゲッターのプロパティ、EXとしてKernelInstance.Get<T>のインスタンスを大量に持っていますこのリファクタリングは、Ninjectインスタンスへのすべての静的参照を削除する目的の一部です)

明らかにアンチパターンと見なされるこのアプローチから離れるにつれて、私はこれらの参照をこのアプローチにリファクタリングしたいと考えています。

public class ClassWithDependencies { 
    readonly IRequiredSevice _requiredService; 
    public ClassWithDependencies(IRequiredService requiredService){ 
    _requiredService = requiredService; 
    } 
} 

私の質問は本当に2倍ですが、どちらの質問にも助けていただければ幸いです。

  1. は、これらの依存関係のコンストラクタ・インジェクションを行う行うには理想的な方法を提供し、上記の例です(SOおよび他の場所での私の研究はイエスを示しているが、私は間違った結論を行った場合、私は入力をお願い申し上げます)。私はこのアプローチが既存のものを改善していると確信していますが、理想的でない場合は、この特定の作品に対して2回目のリファクタリングパスを行う必要はありません。ほとんどの場合、これらはオプションの依存関係(およびコンストラクタの注入パターンを利用する理由)ではなく、プロパティ注入の[Inject]デコレータを認識しています。

  2. このような大規模なリファクタリングを考えているのは、私がresharperでタグ付けしたものです。コンストラクタパラメータを追加するための良いアプローチはありますか?コードスニペット/テンプレートはコンストラクタ内の読み取り専用プライベート変数への代入を自動的に生成し、クラスにフィールドを追加しますか?私はこれを手動で行うことができますが、このパターンが少なくとも数百例は使用されているので、これはかなり面倒で時間がかかることが予想されます。

+1

右方向へのステップ。パート1に答えるためのいくつかの読書:http://deviq.com/explicit-dependencies-principle/パート2は、現在呼び出されている技術的負債の結果です。 – Nkosi

+0

それは改善されていると聞いてうれしいです。退屈なリファクタリングなしでこれを修正する方法はありません。ご意見ありがとうございます。 – Miek

答えて

3
  1. はいこのアプローチは罰金です。コンストラクタに必要な依存性を注入することで、明示的かつ可視化されます。あなたのクラスの依存関係を理解するために、ソースコードを調べる以外に選択肢はありません。彼らはもはやケースではないコンストラクタに注入されるとき。

  2. すぐに現在のコードを修正するには、次の操作を行います。

    IRequiredService SomeService => StaticKernelReference.Get<IRequiredService>(); 
    

    まず、名前の後にすべてのものを削除します:

    IRequiredService SomeService; 
    

    あなたの財産のプライベートフィールドようになりますあなたは、このコード行を持っています。次に、alt-enterを使い、 "コンストラクタからのフィールドの初期化"リファクタリングを使用します。そして、あなたは、この持っている:Alt-Enterキー(あなたはあなたのプライベートフィールドに名前を付ける方法によって異なります)「_serviceに名前の変更」を継続し、その後

    IRequiredService Service; 
    public A(IRequiredService service) { 
        Service = service; 
    } 
    

    を、再度-ALT入力し、「読み取り専用フィールドを作ります」。

    readonly IRequiredService _service; 
    public A(IRequiredService service) { 
        _service = service; 
    } 
    
+0

素晴らしい、パート2へのあなたの答えはまさに私が存在していたと思っていたものです。これはちょうど私に手作業のトンを節約し、このプロセスを少し痛みを少なくする必要があります、ありがとう! このアプローチを聞いてうれしいのもうれしいです。あなたの答えは非常に高く評価されています。 – Miek

関連する問題