Gibt es eine alternative zu bastard-injection? (AKA poor man ' s injection via default Konstruktor)

Ich am häufigsten bin versucht zu verwenden, "bastard-Injektion" in ein paar Fällen. Wenn ich ein "richtiges" dependency injection constructor:

public class ThingMaker {
    ...
    public ThingMaker(IThingSource source){
        _source = source;
    }

Dann aber für Klassen, die ich bin, die beabsichtigen als öffentlichen APIs (Klassen, anderen Entwicklungsteams verbrauchen), ich finde nie eine bessere Möglichkeit, als zu schreiben, ein Standard - "bastard" - Konstruktor mit den meisten-wahrscheinlich brauchte Abhängigkeit:

    public ThingMaker() : this(new DefaultThingSource()) {} 
    ...
}

Der offensichtliche Nachteil hier ist, dass diese erstellt eine statische Abhängigkeit von DefaultThingSource; im Idealfall gäbe es keine solche Abhängigkeit, und die Verbraucher würden immer Spritzen, was IThingSource Sie wollten. Dies ist jedoch zu schwer zu verwenden; wollen die Verbraucher von neuen ein ThingMaker und an die Arbeit machen, Dinge, die dann Monate später injizieren etwas anderes, wenn die Notwendigkeit entsteht. Dies lässt nur ein paar Optionen meiner Meinung nach:

  1. Weglassen der bastard Konstruktor; macht der Verbraucher von ThingMaker zu verstehen IThingSource, zu verstehen, wie ThingMaker interagiert mit IThingSource, finden oder schreiben Sie eine konkrete Klasse, und dann Spritzen Sie eine Instanz in Ihrem Konstruktor aufrufen.
  2. Weglassen der bastard Konstruktor und eine separate Fabrik -, container -, oder andere bootstrapping-Klasse/Methode; irgendwie machen die Verbraucher verstehen, dass Sie nicht brauchen, um zu schreiben Ihre eigenen IThingSource; macht der Verbraucher von ThingMaker zu finden und zu verstehen, die Fabrik oder bootstrapper und verwenden Sie es.
  3. Halten die bastard-Konstruktor, so dass der Verbraucher zu "neu" ein Objekt aus und führen Sie mit ihm, und der Umgang mit dem optionalen statischen Abhängigkeit von DefaultThingSource.

Boy, #3 hat sicher scheint attraktiv. Gibt es eine andere, bessere option? #1 oder #2 einfach nicht scheinen, es lohnt sich.

  • Warum ist die Abhängigkeit von DefaultThingSource schlimmer als die Abhängigkeit von IThingSource? Gehen Sie mit #3.
  • Da DefaultThingSource ist ein potenziell sehr spezifische Umsetzung, mit Abhängigkeit von einem externen system in einer anderen assembly, die auch überholt in ein paar Monaten; IThingSource ist in der stets korrekt und nie gebunden an eine spezifische Implementierung.
  • Natürlich weiß ich nicht, wie Komplex DefaultThingSource ist. Aber ich würde Wetten, dass wenn Sie die Dinge einfach halten und es gut design, in Wirklichkeit werden Sie feststellen, dass Ihr code wird nicht veraltet sein, so schnell wie Sie Angst-mit Sicherheit nicht schnell genug, um zu rechtfertigen, all diese Herzschmerz.
  • Das ist das problem mit guten dependency-inversion - kann es sein, flexibler und besser zu gestalten, aber es ist nicht so einfach für einen neuen programmer zu verwenden.
  • Sie können auch wollen, um einen Blick auf diesen Artikel: lostechies.com/jimmybogard/2009/07/03/...
  • Beachten Sie auch, dass diese Praxis ist auch bekannt als "Poor Man' s Dependency Injection".
  • DefaultthingSource ist ... überholt in ein paar Monaten" - Dann ist es ein sehr schlechter Kandidat für eine "Standard" - in einem öffentlichen Aufruf. Ich vote für #2
  • Deshalb habe ich "möglicherweise" veraltet-wir wissen nicht, wie Sie sich entwickeln wird, in Verwendung. Wir hoffen, dass unsere Verbraucher finden Sie alle Arten von wertvollen Möglichkeiten, unsere software zu nutzen.

Schreibe einen Kommentar