Bei Verwendung der Abhängigkeitsinjektion welche Abhängigkeiten injizieren Sie?Welche Abhängigkeiten sollte ich injizieren?
ich zuvor injiziert alle Abhängigkeiten, aber gefunden haben, wenn TDD tun gibt es typischerweise zwei Arten von Abhängigkeit:
- Diejenigen, die echte externe Abhängigkeiten sind, die beispielsweise kann sich ändern ProductRepository
- Diejenigen, die nur für die Testbarkeit existieren, z.B. Ein Teil des Verhaltens der Klasse, die für die Testbarkeit nur extrahiert und injiziert wurde
Ein Ansatz ist es, alle Abhängigkeiten wie diese
public ClassWithExternalDependency(IExternalDependency external,
IExtractedForTestabilityDependency internal)
{
// assign dependencies ...
}
aber ich habe diese Abhängigkeit aufblasen kann dazu führen, in der gefunden zu injizieren DI-Registrierung.
Ein weiterer Ansatz ist die „Testbarkeit Abhängigkeit“, wie dies
public ClassWithExternalDependency(IExternalDependency external)
: this (external, new ConcreteClassOfInternalDependency())
{}
internal ClassWithExternalDependency(IExternalDependency external,
IExtractedForTestabilityDependency internal)
{
// assign dependencies ...
}
Dies ist mehr Mühe zu verbergen, aber scheint viel mehr Sinn zu machen. Der Nachteil ist, dass nicht alle Objekte im DI-Framework konfiguriert sind, wodurch eine "Best Practice" gebrochen wird, die ich gehört habe.
Welchen Ansatz würden Sie befürworten und warum?
Einer der Vorteile der Invertierung der Abhängigkeiten besteht darin, Einheiten isoliert testen zu können. Ich kann eine Rechnerklasse extrahieren, um sie isoliert zu testen, aber vielleicht muss sie nicht injiziert werden (siehe zweites Codebeispiel). Ich konnte es nicht in-situ testen, da es die Tests für den Client der Rechnerklasse aufblähen würde. – Alex
Injizieren Sie alle injectables, neue alle newables. Ohne diese Unterscheidung würde DI verlangen, dass alle Objekte für die gesamte Dauer des Programms leben. Newables, auch Value-Typen genannt, repräsentieren inerte Daten und optional einige zugehörige transformative Verhaltensweisen (d. H. Methoden, die Werte annehmen und neue Werte zurückgeben). Injectables, auch Service/Business-Typen genannt, stellen Funktionalität und optional einen zugehörigen Programmstatus dar. Natürlich haben wir auch I/O-Typen, um den externen Zustand zu repräsentieren, z. Datei(). E/A-Typen müssen wiederverwendbar sein, sollten jedoch über abstrakte Factories erstellt werden, damit sie für Tests testweise verwendet werden können. – Jegschemesch