Frage Wie ist Dependency Injection anders als das Testen besser als statische Klassen / Methoden?


Abgesehen von der Testbarkeit, was ist der große Vorteil der Verwendung von D.I. (und ich spreche nicht von einem D.I.-Framework oder IoC) über statische Klassen? Insbesondere für eine Anwendung, bei der Sie wissen, dass ein Dienst nicht ausgelagert wird.

In einer unserer c # -Anwendungen verwendet unser Team Dependency Injection in der Web-Web-GUI, der Service-Ebene und der Repository-Ebene, anstatt statische Methoden zu verwenden. In der Vergangenheit hatten wir POCOs (busines entity objects), die von statischen Klassen erstellt, modifiziert, weitergegeben und gespeichert wurden.

Zum Beispiel könnten wir in der Vergangenheit geschrieben haben:

CreditEntity creditObj = CreditEntityManager.GetCredit(customerId);
Decimal creditScore = CreditEntityManager.CalculateScore(creditObj);
return creditScore;

Nun, mit D.I. wäre der gleiche Code:

//not shown, _creditService instantiation/injection in c-tors
CreditEntity creditObj = _creditService.GetCredit(customerId);
Decimal creditScore = _creditService.CalculateScore(creditObj);
return creditScore;

Nicht viel anders, aber jetzt haben wir Dutzende von Serviceklassen, die einen viel breiteren Geltungsbereich haben, was bedeutet, dass wir sie so behandeln sollten, als wären sie statisch (d. H. Keine privaten Membervariablen, außer sie werden verwendet, um weitere Abhängigkeiten zu definieren). Wenn eine dieser Methoden eine Ressource (Datenbank / Webdienst / etc) verwendet, ist es schwieriger, Nebenläufigkeitsprobleme zu behandeln, es sei denn, wir entfernen die Abhängigkeit und verwenden die alte statische oder using(...) Methoden.


5
2017-09-27 04:50


Ursprung


Antworten:


Die Frage nach D.I. könnte sein: ist CreditEntityManager in der Tat der natürliche Ort, um Wissen zu zentralisieren, wie man einen findet CreditEntity und wohin ich gehe CalculateScore?

Ich denke, die Theorie von D.I. Ist das eine modulare Anwendung in Sache beteiligt X weiß nicht unbedingt, wie man sich mit Dingen verbindet Y obwohl X braucht Y.

In Ihrem Beispiel zeigen Sie den Code-Flow, nachdem die Service-Provider gefunden und in Datenobjekte eingebunden wurden. An diesem Punkt, sicher, mit und ohne D.I. es sieht ungefähr gleich aus, sogar potentiell genau Das Gleiche hängt von Programmiersprache, Stil usw. ab.

Der Schlüssel ist, wie diese verschiedenen Dienste miteinander verbunden sind. In D.I. führt potentiell ein Objekt eines Drittanbieters im Wesentlichen eine Konfigurationsverwaltung durch, aber danach sollte der Code in etwa gleich sein. Der Punkt von D.I. Es geht nicht darum, den späteren Code zu verbessern, sondern zu versuchen, die Modularität des Problems mit der Modularität des Programms in Übereinstimmung zu bringen, um zu vermeiden, dass logisch korrekte Module und Programmlogik bearbeitet werden müssen, aber mit dem falschen Service verbunden sind Anbieter.


5
2017-09-27 05:02



Sie können Implementierungen austauschen, ohne den Code zu öffnen. In einer meiner Anwendungen haben wir beispielsweise eine Schnittstelle namens IDataService erstellt, die Methoden zum Abfragen einer Datenquelle definiert. Für die ersten Produktionsversionen verwendeten wir eine Implementierung für Oracle mit nHibernate. Später wollten wir zu einer Objektdatenbank wechseln, also schrieben wir und implementierten für db4o, fügten seine Assembly zum Ausführungsverzeichnis hinzu und änderten eine Zeile in der Konfigurationsdatei. Presto! Wir verwendeten db4o, ohne den Code öffnen zu müssen.


1
2017-09-27 05:03



Dies wurde genau 1002 mal diskutiert. Hier ist eine solche Diskussion, an die ich mich erinnere (in der Reihenfolge gelesen):

  1. http://scruffylookingcatherder.com/archive/2007/08/07/dependency-injektion.aspx
  2. http://ayende.com/Blog/archive/2007/08/18/Dependency-Injection-More-than-a-testing-seam.aspx
  3. http://kohari.org/2007/08/15/defending-dependency-injection
  4. http://scruffylookingcatherder.com/archive/2007/08/16/tilting-at-windmills.aspx
  5. http://ayende.com/Blog/archive/2007/08/18/Dependency-Injection-IAmDonQuixote.aspx
  6. http://scruffylookingcatherder.com/archive/2007/08/20/poking-bears.aspx
  7. http://ayende.com/Blog/archive/2007/08/21/Dependency-Injection-Applicability-Benefits-and-Mocking.aspx

Über Ihre speziellen Probleme scheint es, dass Sie Ihre Lebensgewohnheiten nicht korrekt verwalten. Zum Beispiel, wenn einer Ihrer Dienste zustandsbehaftet ist (was ziemlich selten sein sollte), muss er wahrscheinlich vorübergehend sein. Ich empfehle Ihnen, so viele SO-Fragen zu stellen, wie Sie benötigen, um alle Zweifel auszuräumen.


1
2017-09-27 05:06



Da ist ein Guice Video was einen schönen Beispielfall für die Verwendung von D.I. Wenn Sie viele Dienste von Drittanbietern verwenden, die dynamisch an DHCP angeschlossen werden müssen, ist dies eine große Hilfe.


0
2017-09-27 05:06