Beim Schreiben von Code sollten wir in der Lage sein, zwei große Gruppen von Objekten zu identifizieren:
- Injektionsmittel
- Newables
http://www.loosecouplings.com/2011/01/how-to-write-testable-code-overview.html
http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/
-
Injizierbare Objekte sind Objekte (Dienste), die in ihren Konstruktoren Abhängigkeiten offenlegen. Diese Abhängigkeiten werden in der Regel mithilfe eines IoC-Containers aufgelöst; diese Objekte können in ihren Konstruktoren nur nach anderen injizierbaren Objekten fragen
-
Newable sind Objekte, die auch Abhängigkeiten in ihren Konstruktoren offenlegen, aber Newables können nur nach anderen newable Objekten (Entities, Value Objects) fragen, ein weiteres Merkmal von newable Objekten ist, dass sie keinen Verweis auf ein injizierbares Objekt enthalten sollten
Aber beim Schreiben von Code müssen wir oft einen Dienst (injectable) in eine Entität (newable) "injizieren".
Ich habe gedacht, dass vielleicht eine Service-Abhängigkeit in einem newable Objekt ist besser tun es auf Methodenebene, aber das klingt wie eine Menge Arbeit zu tun.... nur über die Auflösung der Abhängigkeiten jedes Mal, wenn eine Methode aufgerufen wird.... gut das riecht wie wir den Service Locator Anti-Muster verwenden müssen
Ich habe das Problem auf folgende Weise gelöst:
-
Erstellen einer Schnittstelle mit einer Methode, die die Abhängigkeit offenlegt (der Dienst wird in dieser Methode verwendet)
-
Erstellen Sie eine Erweiterungsmethode für die Schnittstelle und platzieren Sie sie in einem anderen Namensraum, vielleicht in einer anderen Baugruppe, und verpacken Sie den Aufruf der ursprünglichen Methode, indem Sie die Abhängigkeit mit einem Service Locator auflösen
Auf diese Weise haben wir eine konsequente Trennung zwischen newable und injectable Objekten mit der Möglichkeit, Dienste in unseren newables einfach zu verwenden
- Was meinen Sie dazu?
- Die Verwendung des Service Locators in einer Erweiterungsmethode wird als schlechte Praxis angesehen?
- Wie würden Sie den Aufruf der Erweiterungsmethode unit-testen?