Im Allgemeinen sind meine Abhängigkeiten zu Schnittstellen abstrahiert, aber ich werde nur eine konkrete Implementierung während der nicht testing Verwendung verwenden. Zum Beispiel gab ich ein FooService
schreiben:Dependency Injection: was verlieren Sie beim Instanziieren konkreter Klassen im parameterlosen Konstruktor
public class FooService : IFooService
{
private readonly IBarDependency _barDependency;
public FooService(IBarDependency barDependency)
{
this._barDependency = barDependency;
}
public FooService() : this (new BarDependency())
{
// nothing to do here
}
. . . // code goes here
}
Jetzt Puristen neigen entsetzt nach Luft zu schnappen, weil ich eine konkrete Klasse im Konstruktor instanziiert parameterlos. Ich habe dies in der Vergangenheit mit einem Achselzucken abgetan, weil ich weiß, dass ich die konkrete Klasse nur dann nicht verwenden werde, wenn ich Abhängigkeiten teste und verspotte.
Während es tut Paar die FooService
Klasse in die BarDependency
Klasse, es ist kein eng Kupplung; Diese Klassen und Interfaces existieren auch in der gleichen Assembly, daher scheint es mir nicht so, als ob ich hier viel verliere oder mich in eine Ecke male. Ich kann die Klasse FooService
immer noch leicht testen, ohne Code zu bekommen, der nicht manipulierbar ist, nur indem ich den Konstruktor benutze, der es mir erlaubt, überspannte Schnittstellen zu übergeben.
Die Frage ist also: Was ist hier eigentlich gefährdet? Was verliere ich mit diesem Muster, das einen IoC-Container wert ist?
Ich verwende den gleichen Ansatz in kleinen Projekten. DI und andere "doing it right" -Regeln machen kleine Projekte meist zu komplex. Sicher, es bringt viele Vorteile, aber es ist nicht immer die Mühe wert. –