Frage Konstruktorabhängigkeits-Code-Snippet in Visual Studio


Ich finde, dass ich Konstrukteuren so viele Abhängigkeiten hinzufüge:

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

Sie sind ziemlich mühsam zu schreiben, ich habe Code-Snippets im Visual Studio gesucht, um automatisch einen zum Konstruktor hinzuzufügen, aber keinen gefunden.

Was ich will ist:

  • Beim Hinzufügen einer Abhängigkeit zu einem Konstruktor erstellt ein Snippet automatisch eine lokale Variable und ordnet sie zu.

ODER

  • Fügen Sie eine private Variable hinzu und fügen Sie sie dann automatisch dem Konstruktor hinzu und weisen Sie sie der lokalen Variablen zu.

12
2018-01-21 15:27


Ursprung


Antworten:


Wenn Sie haben R # Sie können die Felddeklarationen eingeben und sie dann markieren und drücken Alt-Enter Das gibt Ihnen die Möglichkeit, die Konstruktor- und Feldzuweisungen zu generieren.

enter image description here


13
2018-02-02 03:27



Wenn Sie Resharper nicht haben, können Sie den Parameter im Konstruktor hinzufügen, die Zuweisung auf eine nicht existierende Eigenschaft schreiben und STRG + drücken. . Dadurch werden Sie aufgefordert, automatisch eine Eigenschaft oder ein Feld für Sie zu erstellen.

Zum Beispiel haben Sie diese Klasse:

public class MyClass 
{ 
    public MyClass()
    { 
    }
}

Sie fügen dann den Parameter dem Konstruktor und der Zuweisung hinzu:

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

Und drücken Sie STRG +. während Sie auf der Asignament-Linie sind, und wählen Sie create field, und Sie erhalten Folgendes:

public class MyClass 
{         
    IDependency myDependency;

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

3
2018-02-04 16:44



Sie können Code-Snippets ganz einfach hinzufügen, indem Sie sie in XAML definieren und den Editor hinzufügen. Sie können Platzhalter wie "Klassenname" verwenden, um sie beispielsweise als Konstruktor zu verwenden, und dann Ihre Variablen als statischen Text einfügen

Ich möchte den Code nicht schreiben, weil er dupliziert ist Sie können hier nachsehen, wie es geht: https://msdn.microsoft.com/en-us/library/ms242312.aspx?f=255&MSPPError=-2147217396

Sie können diese Frage auch sehen: Wie kann ich automatisch einen Konstruktor generieren, der Dienste kostenlos empfängt und speichert?


0
2018-02-01 20:17



Was Sie mit ISomeService und IAnotherService versuchen, ist die Inversion von Abhängigkeiten.

Ich würde Ihnen wärmstens empfehlen, dies mit einem Framework zur Abhängigkeitsinjektion zu kombinieren. Es gibt viele verfügbare, aber eine, die ich empfehlen würde, ist MEF. MEF ist in das .NET-Framework integriert. Zum Beispiel würde Ihr Code mit MEF so aussehen

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


public class SomeClass {

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

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

}

Jetzt stellt MEF sicher, dass Ihre SomeService- und AnotherService-Eigenschaften gefüllt sind, wenn Ihre Klasse erstellt wird. Es wird (falls erforderlich) eine Instanz von SomeService erstellen, alle Abhängigkeiten füllen und in die richtige Eigenschaft einfügen. Sie können sogar steuern, ob Ihre Services bei Bedarf als Singletons oder als neue Serviceinstanz instanziiert werden sollen.

Für weitere Details zu MEF können Sie hier nachsehen https://msdn.microsoft.com/en-us/library/ee155691(v=vs.110).aspx

Dies sollte vermeiden, die vielen Konstruktoren zu schreiben, die nichts anderes tun, als Services zu initialisieren.


0
2018-02-05 08:24



Teleriks JustCode kann genau das, was Sie brauchen.
Wenn Sie im Konstruktor ein unbenutztes Argument haben, können Sie ein Feld erstellen und initialisieren. http://www.telerik.com/products/justcode/quick-fixes.aspx


0
2018-02-06 09:13