Design von Mehrschichtanwendungen (Service Registry vs Singleton vs X)
-
Hallo! Ihr seit echt eine tolle Hilfe bei der Sammlung von Praxiserfahrung in C++!
Jetzt stehe ich wieder von einer Designfrage.Ich möchte eine klare Trennung zwischen meiner Service- und meiner Persistenzschicht haben, sogar soweit lose gekoppelt das ich später schnell und einfach die Persistenzschicht austauschen kann(z.B. *SQL gegen NoSQL). Der Zugriff auf die Persistenzschicht erfolgt über Klassen die nur rein virtuelle Methoden zur Verfügung stellen (diese werden dann von der jeweiligen eingesetzten Technologie implementiert). Die Serviceschicht weiß somit nichts von der eingesetzten Technik.
Nun zu meiner Frage: Wann und wo instantiiere ich die Klassen und wie mache ich das Lookup in den Services? Singleton entwickelt sich anscheinend immer mehr zu einem Anti-Pattern (zumindest was ich so über die Suche gefunden habe). Zentrale Factory Klassen oder eine Art zentrale Map finde ich aber auch nicht wirklich schön.
Wie macht ihr das?
-
guck dir vielleicht mal die abstrakte fabrik an...
die ist eigentlich für genau sowas da. du hast die schnittstellen, aber möchtest nicht mit konkreten klassen arbeiten, und eben die werden von der abstract-factory gebaut
-
In Java ganz klar Dependency Injection. In C++ am ehesten über manuelle Dependency Injection. Die Klasse, die das ganze aufsetzt und zusammenbaut, übergibt dem Service das Objekt, das die Persistenzschicht implementiert. Wie man an den Service selber rankommt ist etwas schwieriger (weil es potenziell viel mehr Klassen gibt, die irgendwo diesen Service brauche). Hier finde ich einen Singleton Service Locator (von mir aus abstrakt, damit man ihn z.B. für Unit Tests überschreiben kann) eigentlich ok. So lang nur eine Factory ein Singleton ist und nicht die Services selber, ist das ganze noch erweiterbar und austauschbar. Wobei ich auch hier nach Möglichkeit Dependency Injection bevorzugen würde.
-
was ist denn manuelle dependency injection in C++?
-
Skym0sh0 schrieb:
was ist denn manuelle dependency injection in C++?
Im Endeffekt dasselbe wie in Java. Also, z.B. die Abhängigkeiten im Konstruktor oder über Setter Methoden übergeben. Manuell, weil sich dann jemand selber drum kümmern muss. In Java würde das "automatisch" gehen, indem man die Abhängigkeiten z.B. in einer XML Datei deklariert.
-
Mechanics schrieb:
Skym0sh0 schrieb:
was ist denn manuelle dependency injection in C++?
Im Endeffekt dasselbe wie in Java. Also, z.B. die Abhängigkeiten im Konstruktor oder über Setter Methoden übergeben. Manuell, weil sich dann jemand selber drum kümmern muss. In Java würde das "automatisch" gehen, indem man die Abhängigkeiten z.B. in einer XML Datei deklariert.
Du lebt noch in der Java Steinzeit, oder? Wer verwendet XML

-
Zeus schrieb:
Mechanics schrieb:
Skym0sh0 schrieb:
was ist denn manuelle dependency injection in C++?
Im Endeffekt dasselbe wie in Java. Also, z.B. die Abhängigkeiten im Konstruktor oder über Setter Methoden übergeben. Manuell, weil sich dann jemand selber drum kümmern muss. In Java würde das "automatisch" gehen, indem man die Abhängigkeiten z.B. in einer XML Datei deklariert.
Du lebt noch in der Java Steinzeit, oder? Wer verwendet XML

Geschmackssache. Außerdem habe ich "z.B." geschrieben. In der Tat ist es mir ziemlich egal, ob man sowas über XML, Annotations oder per Code konfiguriert. Ich bin XML gewohnt und kann damit auch leben, find die konkrete Methode aber völlig nebensächlich.
-
ok, könnt ihr mir dann nochmal kurz dependency injection zusammen fassen?
aus der java welt kenne ich das mit spring und xml halt, aber was da mit settern ist?!
es ist da ja so, dass man inversion of control anwendet, sprich gegen schnittstellen programmiert und die konkreten klassen per spring und java beans injiziert.
aber was haben getter/setter damit zu tun?
-
Skym0sh0 schrieb:
ok, könnt ihr mir dann nochmal kurz dependency injection zusammen fassen?
aus der java welt kenne ich das mit spring und xml halt, aber was da mit settern ist?!
es ist da ja so, dass man inversion of control anwendet, sprich gegen schnittstellen programmiert und die konkreten klassen per spring und java beans injiziert.
aber was haben getter/setter damit zu tun?Und wie injiziert man sie? Über den Konstruktor bzw. über setter Methoden. Das ist das was man in Spring als property angeben würde, irgendwie so:
<bean id="..." class="..."> <property name="bla" ref="..." /> </bean>Dann müsste die entsprechende Klasse eine Methode setBla haben.
Und mit manuell meinte ich eben, dass jemand diese Methode eben von Hand aufruft, und nicht durch das Framework.
-
Die Sachen die in C# / Java üblich sind, sind in C++ total unüblich.