2009-09-17 5 views
10

Mein aktuelles Projekt nutzt Spring, und unser Architekt hat entschieden, Spring Dienste, Repositories und Factory-Objekte, aber KEINE Domänenobjekte verwalten zu lassen. Wir verfolgen das Domain-Design sehr genau. Der Grund dafür, dass keine Feder für Domänenobjekte verwendet wird, ist in erster Linie, dass die Feder nur eine statische Abhängigkeitsinjektion erlaubt. Was ich mit der statischen Abhängigkeitsinjektion meine, ist, dass Abhängigkeiten in der xml-Konfiguration angegeben sind und sie "eingefroren" werden.Laufzeitabhängigkeitsinjektion mit Spring

Ich vielleicht falsch, aber mein derzeitiges Verständnis ist, dass, obwohl meine Domäne nur Schnittstellen verwendet, um mit Objekten zu kommunizieren, aber Frühling Xml-Konfiguration zwingt mich, eine konkrete Abhängigkeit anzugeben. Daher müssen alle konkreten Abhängigkeiten zum Zeitpunkt der Bereitstellung aufgelöst werden. Manchmal ist dies nicht machbar. Die meisten unserer Anwendungsfälle basieren auf der Injektion eines bestimmten Typs basierend auf den Laufzeitdaten oder einer Nachricht, die von einem Endbenutzer empfangen wird.

Die meisten unserer Design folgt Befehlsmuster. Wenn wir also einen Befehl erhalten, möchten wir unser Domänenmodell konstruieren und basierend auf Daten, die wir von einem Befehl erhalten haben, injizieren wir eine bestimmte Menge von Typen in unser gesamtes Wurzelobjekt. Aus diesem Grund sind wir aufgrund der fehlenden Möglichkeit, ein Domänenmodell auf Basis von Laufzeitdaten zu konstruieren, gezwungen, statische Factory-Methoden, Builder und Factory-Patterns zu verwenden.

Kann jemand bitte beraten, wenn Frühling ein Problem zum oben genannten Szenario hat?

Ich könnte AOP verwenden, um Abhängigkeiten zu injizieren, aber dann nutze ich die Infrastruktur des Frühlings nicht.

Antwort

2

Spring Abhängigkeitseinspeisung (und Abhängigkeitsinjektion im Allgemeinen) ist im Grunde für die Verdrahtung von Services, Repositories und Fabriken, etc. Es soll nicht direkt Dinge, die dynamisch in Reaktion auf Befehle usw., die durchgeführt werden müssen, zu tun die meisten Sachen mit Domain-Objekten. Stattdessen bietet es Kontrolle darüber, wie diese Dinge getan werden, indem Sie die Objekte, die Sie verwenden möchten, damit verbinden können.

+2

Das ist Spring ein bisschen kurz. Es ist fähig zu diesen Dingen, es erfordert nur ein bisschen mehr Aufwand. – skaffman

10

Ich empfehle Ihnen, den Abschnitt in der Frühjahrsdokumentation zu lesen, der Using AspectJ to dependency inject domain objects with Spring betrifft.

Es ist interessant, dass Sie sagten: "Ich könnte AOP verwenden, um Abhängigkeiten zu injizieren, aber dann nutze ich die Infrastruktur des Frühlings nicht," in Anbetracht dessen, dass AOP ein Kernteil der Infrastruktur von Spring ist. Die beiden passen sehr gut zusammen.

Der obige Link ermöglicht Ihnen, Abhängigkeiten von Spring's AOP transparent in Domänenobjekte einzufügen, die ohne direkten Bezug auf die Spring-Infrastruktur erstellt werden (z. B. mit dem Operator new). Es ist sehr clever, erfordert aber ein bisschen Classbloading-Basteln.

+0

+1. Abhängig von der Komplexität dieses speziellen Szenarios ist es jedoch möglich (und einfacher), FactoryBeans anstelle von AOP zu verwenden. – ChssPly76

+0

Ich stimme zu, ich würde normalerweise nicht stören. Wenn die Anwendung jedoch eine hard-core-DDD ist, sind Fabriken möglicherweise nicht wünschenswert. – skaffman

5

Die Spring-Abhängigkeitsinjektion/-konfiguration dient nur zum Konfigurieren der untergeordneten technischen Infrastruktur, z. B. Datenquellen, Transaktionsverwaltung, Remoting, Servlet-Mount-Punkte und so weiter.

Sie verwenden Spring, um zwischen technischen APIs und Ihren Diensten zu routen, und innerhalb dieser Dienste schreiben Sie nur normalen Java-Code. Es ist eine gute Sache, Spring von Ihren Modell- und Service-Implementierungen fernzuhalten. Zunächst möchten Sie die Geschäftslogik Ihrer Anwendung nicht an ein Framework binden oder technische Probleme auf niedriger Ebene in Ihr Anwendungsdomänenmodell "auslaufen lassen". Java-Code ist in der IDE wesentlich einfacher zu modifizieren als die XML-Konfiguration von Spring. Durch die Beibehaltung der Geschäftslogik in Java können Sie neue Funktionen schneller bereitstellen und die Anwendung einfacher verwalten. Java ist wesentlich expressiver als das XML-Format von Spring, sodass Sie Domain-Konzepte klarer modellieren können, wenn Sie sich an Java halten.

+0

nur weil Frühling kann eine Menge Dinge nicht bedeutet, die richtige Antwort ist es, Ihre App Spring für all diese Dinge zu nutzen. – M1EK

+0

Während dies für das Standardanämiedomänenmodell gilt, IMO ist es in Ordnung, diese Dinge in einem domänengesteuerten Design zu tun (was das OP sagt, dass er es benutzt). –

+0

Diese Antwort gilt sehr (wahrscheinlich mehr) für nicht anämische Domänenmodelle, die ein sauberes objektorientiertes Design haben und Domänenlogik als Methoden für die Domänenmodellobjekte implementieren. Und anämische Domain-Modelle sind sehr, sehr, nicht Standard. Sie sind etwas zu vermeiden *. – Nat

Verwandte Themen