Ich habe darüber nachgedacht, wie man testbares Design mithilfe der Abhängigkeitsinjektion mit der Bereitstellung einer einfachen festen öffentlichen API ausbalanciert. Mein Dilemma ist: Die Leute möchten so etwas tun var server = new Server(){ ... }
und müssen sich nicht darum kümmern, die vielen Abhängigkeiten und die Abhängigkeitsgraphen zu erstellen, die ein Mensch haben Server(,,,,,,)
kann. Während der Entwicklung mache ich mir keine allzu großen Sorgen, da ich ein IoC / DI-Framework verwende, um all das zu handhaben (ich verwende nicht die Aspekte des Lebenszyklusmanagements eines Containers, die die Dinge weiter komplizieren würden).
Jetzt ist es unwahrscheinlich, dass die Abhängigkeiten erneut implementiert werden. In diesem Fall dient die Komponentierung fast ausschließlich der Testbarkeit (und einem anständigen Design!), Anstatt Nähte für Erweiterungen usw. zu erstellen. In 99,999% der Fälle möchten Benutzer eine Standardkonfiguration verwenden. So. Ich könnte die Abhängigkeiten fest codieren. Will das nicht, wir verlieren unsere Tests! Ich könnte einen Standardkonstruktor mit fest codierten Abhängigkeiten und einen, der Abhängigkeiten akzeptiert, bereitstellen. Das ist ... chaotisch und wahrscheinlich verwirrend, aber machbar. Ich könnte den abhängigkeitsempfangenden Konstruktor intern machen und meine Unit-Tests zu einer Friend-Assembly machen (unter der Annahme von C #), die die öffentliche API aufräumt, aber eine unangenehme versteckte Falle zur Wartung zurücklässt. Zwei Konstruktoren zu haben, die implizit und nicht explizit miteinander verbunden sind, wäre in meinem Buch im Allgemeinen ein schlechtes Design.
Im Moment ist das ungefähr das geringste Übel, an das ich denken kann. Meinungen? Weisheit?