2016-01-21 11 views
11

がそうのようなコンストラクタに多くを依存関係:コンストラクタ依存コードスニペット

public class SomeClass() { 
    private ISomeService _service; 
    private IAnotherService _anotherService; 
    public SomeClass(ISomeService service, IAnotherService anotherService) { 
     _service = service; 
     _anotherService = anotherService; 
    } 
} 

彼らは書くのはかなり退屈だ、私は自動的にVisual Studioでコードスニペットを探してきました1つをコンストラクタに追加しますが、コンストラクタを見つけられません。

私は何をしたいことは次のとおりです。

  • いくつかのスニペットは自動的にローカル変数を作成し、それに割り当てられ、コンストラクタへの依存関係を追加します。

OR

  • プライベート変数を追加して、いくつかのスニペットが自動的にコンストラクタにそれを追加し、ローカル変数に割り当てます。
+0

対象となるC#のバージョンとビジュアルスタジオのバージョンを指定します。それは異なる答えを提供することができます。 – OmegaMan

+0

@OmegaMan対2015、.net 4.5 –

+0

あなたは何を求めているのですか?プライベートフィールドを選択してコンストラクタを生成したいですか? – Jannik

答えて

12

R#がある場合は、フィールド宣言を入力して強調表示し、Alt-Enterを押すと、コンストラクターとフィールドの割り当てを生成するオプションが表示されます。

enter image description here

+0

これを数日間使用して、それは本当にいいです。 –

0

XAMLで定義し、editiorを追加することで、簡単にコードスニペットを追加できます。たとえば、「クラス名」などのプレースホルダを使用して、たとえばコンストラクタとして使用して変数を配置できますあなたがここでそれを行う方法を確認することができ 重複しているため、それのように静的なテキスト

に、私はコードを記述する必要はありません: https://msdn.microsoft.com/en-us/library/ms242312.aspx?f=255&MSPPError=-2147217396

をあなたもこの質問を見ることができます: How can I automatically generate a constructor that receives and stores services for free?

3

あなたはReSharperのを持っていない場合、あなたは、コンストラクタにパラメータを追加unexistingプロパティにassignamentを書いて、CTRL +を打つことができます。 。これにより、自動的にプロパティまたはフィールドを作成するオプションが表示されます。例えば

、あなたはこのクラスを持っている:あなたは、その後、コンストラクタにパラメータを追加

public class MyClass 
{ 
    public MyClass() 
    { 
    } 
} 

、およびassignament:

public class MyClass 
{ 
    public MyClass(IDependency myDependency) 
    { 
     this.myDependency = myDependency; 
    } 
} 

そしてCTRL +を押してください。 asignamentライン上ながら、フィールドを作成して選択して、あなたは、この取得します:あなたはISomeServiceとIAnotherServiceでやろうとしているもの

public class MyClass 
{   
    IDependency myDependency; 

    public MyClass(IDependency myDependency) 
    { 
     this.myDependency = myDependency; 
    } 
} 
0

は、依存関係の反転を行うことです。

これを依存性注入フレームワークと組み合わせることを強くお勧めします。利用可能なものはたくさんありますが、MEFをお勧めします。 MEFは.netフレームワークに組み込まれています。例えば、あなたのコードは、MEF

[Export(typeof(ISomeService))] 
public class SomeService : ISomeService { 
} 


public class SomeClass { 

    [Import] 
    public ISomeService SomeService {get; set;} 

    [Import] 
    public IAnotherService AnotherService {get; set;} 

} 

とこのようになります。今、MEFは、実際にあなたのクラスが作成されたときに、あなたのSomeServiceとAnotherService性質が満たされていることを確認します。SomeServiceのインスタンスを構築し(必要に応じて)、すべての依存関係を記入し、それを適切なプロパティに配置します。必要になるたびに、サービスをシングルトンとしてインスタンス化するか、新しいサービスインスタンスとしてインスタンス化するかを制御することもできます。

MEFの詳細については、こちらのページからhttps://msdn.microsoft.com/en-us/library/ee155691(v=vs.110).aspx

見ることができますこれは、サービスを初期化する以外何もしない多くのコンストラクタを書くことは避けるべきです。

+0

私はsimpleinjectorを使用しています。私はどのようにdiを行うのか尋ねていませんでした。あなたがしていることは、物事の注入だけです。私はそれが神のようなクラスを奨励しているので、避けたいものです。 –

+0

あなたは退屈な定型文を書くのを避ける方法を求めていました。 IGodServiceプロパティがある場合、またはIGodServiceをコンストラクタの引数として追加した場合。いずれにしても、開発者は貧弱なコードを書くことができます。この方法(propertyInjection)は、定型句を避けるだけです – Batavia

+0

あなたは退屈な定型句について正しいです、提案のおかげで。私が意味していたのは、あなた自身が実際に注入している依存性の数が分からないので、クラス自体(注入している場所)がプロパティ注入を伴うgodclassになる可能性が高いということでした。それはそれ自体が間違っているわけではありません(それはまったく新しい議論です)と確かに私が探しているものではない関連する答えです。 –

0

TelerikのJustCodeは、あなたが必要とするものを正確に行うことができます。
コンストラクタに未使用の引数がある場合、フィールドを作成して初期化することができます。 http://www.telerik.com/products/justcode/quick-fixes.aspx

関連する問題