2011-01-13 7 views
6

Ich bin neu in diesem IoC- und DI-Geschäft- Ich habe das Gefühl, dass ich das Konzept bekomme, wenn Sie Objekte mit globaler Reichweite weitergeben, aber ich bekomme es nicht wie es funktioniert, wenn Sie ein Objekt mit einem bestimmten logischen Status weitergeben müssen. Wenn ich zum Beispiel ein Personenobjekt in ein Schreibdatei-Befehlsobjekt injizieren möchte - wie würde ich in der Lage sein, das korrekte Personenobjekt dynamisch auszuwählen? Nach dem, was ich gesehen habe, konnte ich das Objekt standardmäßig erstellen, aber meine Trennung besteht darin, dass Sie kein standardmäßiges Personenobjekt verwenden würden, sondern dynamisch. Ich nehme an, dass der IoC-Container den Zustand des Objekts für Sie nur beibehalten kann, wenn es herumgereicht wird, aber dann gehen Sie davon aus, dass Sie nur mit einem Objekt arbeiten, weil es keine Thread-Sicherheit geben würde, richtig? Ich weiß, dass mir etwas fehlt (vielleicht so etwas wie eine Fabrikklasse), aber ich brauche ein wenig mehr Informationen darüber, wie das funktionieren würde.IoC Dependency Injection für statusbehaftete Objekte (nicht global)

Antwort

6

Nun, Sie können immer einen Abstract Factory in Ihren Consumer injizieren und verwenden, um die lokal begrenzten Objekte zu erstellen.

Dies ist manchmal notwendig. Sehen Sie diese Beispiele:

jedoch im Allgemeinen neigen wir dazu, nicht DI verwenden für die Wesen, aber vor allem für Dienstleistungen. Stattdessen werden Entitäten normalerweise durch eine Art Repository erstellt.

+0

Also im Allgemeinen Entitäten würde überhaupt nicht Teil der DI-Infrastruktur sein? Übertreibe ich das? – mytwocents

+1

Das stimmt: Entitäten und Wertobjekte neigen dazu, getrennte Leben zu führen. In gewissem Sinne werden sie immer noch irgendwie von der DI-Infrastruktur verwaltet (im Idealfall alles), aber auf sehr indirekte Weise. Sie werden normalerweise über Repositories oder Ähnliches in den permanenten Speicher gelesen und geschrieben, und * diese * sind Dienste, die Teil der DI-Infrastruktur sind. –

+0

Ok, ich dachte, der DI - Chef würde sagen, dass die Person Enitity - Objekt aus dem IoC - Container zur Verfügung gestellt werden sollte (via Konfiguration) ... – mytwocents

4

Wenn Sie ein Serviceobjekt erstellen (z. B. WriteFileService), injizieren Sie darin Dinge, die es intern benötigt, um seine Aufgabe zu erfüllen. Vielleicht braucht es ein Dateisystem-Objekt oder etwas. Das Person Objekt in Ihrem Beispiel sollte als Parameter für einen Methodenaufruf an das Dienstobjekt übergeben werden. z.B. writeFileService.write(person)

+0

Sie würden also den WriteFileService nicht in das Entity-Objekt einfügen ... also kann ich in diesem Fall sehen, wie die Entity ohne die DI-Infrastruktur verwendet werden kann. Obwohl der WriteFileService wahrscheinlich die DI-Infrastruktur verwendet hat, als sie erstellt wurde (basierend auf einer Notwendigkeit für eine injizierte Klasse, die in eine bestimmte Ausgabe schreibt, z.WriterA - schreibt in die Datenbank, WriterB - Rechte an eine Konsole etc ...). – mytwocents