![]() |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
![]() ![]() Zitat:
Um es nochmal zu erwähnen: Beschäftigt euch erst mit DI an sich, verinnerlicht, was man dadurch gewinnt und was man ggf aufgeben muss (in der Regel schlechte Angewohnheiten). Die Benutzung eines DI Containers ist eine Stufe weiter. Wenn man nicht manuell DI betreiben kann (TSomeComponent.Create(OtherComponent) IST dependency injection!), kann man's auch nicht mit nem Container. Zitat:
Was man davon hat, wenn bestimmte Schnittstellen nicht flexibel sind, kennt jeder, der schonmal von verschiedenen Herstellern ein Mobiltelefon hatte (hey, jeder hat seinen eigenen Stecker für das Ladekabel...) Und wie gut, dass man man in der Regel nicht beim Kauf einer neuen Glühbirne den Hersteller der Lampe wissen muss, weil die ihre eigenen Fassungen haben, oder? Oder dass der Hersteller seine Lampen nur mit 40 Watt Osram Birnen getestet hat und sie mit den anderen Herstellern kaputt geht. Aber bei Software muss immer alles ineiner verbacken sein und wenn man von Modularität spricht, wird die "over engeneering" Karte ausgespielt. |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
|
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
Dass mein Beispiel nicht ganz passt, ist meinem Versuch geschuldet, den "Delphi-Weg" bei der Herangehensweise zu simulieren. Hätte ich vielleicht etwas besser machen können. |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
Und Deine Schlussfolgerung, dass nur der, wer auf diese Ansätze verzichtet, wahrhaft Ergebnisse für Profis abliefern kann, leuchtet mir nicht ein. |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
"Patterns are unlikely to cover every aspect of an architecture. Any non-trivial design has lots of aspects that no pattern addresses. It’s up to you to fill in the spaces with your own creativity." |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
Einige Impulse kommen ja auch davon, dass viele Leute hier nicht mehr ausschließlich nur in Delphi unterwegs sind. Beispielsweise in XCode kommt man mit dem herkömmlichen Delphi-Ansatz nicht sehr weit. Daraus mehme ich meine Motivation: Mache es schon in Delphi so, wie es auch in anderen Sprachen anwendbar ist, damit ein Sprach- oder Plattform-Wechsel im Idealfall nur noch eine Syntax-Umstellung ist. Du kennst vielleicht schon die ![]() |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Ich verfolge ja gerade diesen Thread...
Wenn ich das richtig mit diesem Spring verstehe, dann muß man bei den Klassen konsequent Daten und Funktion aufteilen in je eine Extra-Klasse und die Klasse mit den Funktionen kommt dann in diesen GlobalContainer. Verstehe ich das richtig? Gruss Jens |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
Das Prinzip des Spring-DI-Containers ist - mit etwas Phantasie - vergleichbar mit den Abläufen bei der Automontage. Dort ist es ja eher unüblich, beim Montieren (Create) des Autos die Bestandteile (Motor, Blinker etc.) ebenfalls mit herzustellen: sie werden stattdessen aus dem Warenlager (DI-Container) so beigestellt, wie sie in der Produktion beim Create() des Autos benötigt werden. In Spring meldest Du die Klassen, die Du im Warenlager verwalten willst, im einfachsten Fall so an:
Delphi-Quellcode:
Das passiert analog auch in den Units uBlinker etc.
unit uMotor;
interface uses classes; type IMotor = interface ['{F23C0AAF-0D7F-4CFF-A4A6-FDEB4EC5FDF0}'] procedure Brumm; end; implementation uses Spring.Container, Spring.Services; type TMotor = class(TInterfacedObject, IMotor) private procedure Brumm; end; initialization GlobalContainer.RegisterComponent<TMotor>.Implements<IMotor>.AsSingleton; Ich rufe i.d.R. in der dpr-Datei auf:
Delphi-Quellcode:
Dieser einmalige Aufruf ist erforderlich, damit der Container weiß, dass alles beieinander ist. Vergisst man das, so gibt's später eine Fehlermeldung.
GlobalContainer.Build;
Dort, wo der Motor benötigt wird, macht man nicht mehr
Delphi-Quellcode:
, sondern:
FMotor := TMotor.Create();
Delphi-Quellcode:
Das ist erst einmal schon alles. Damit man nicht die Unit uMotor einbinden muss, sollte die Interface-Deklaration von IMotor in eine eigene Unit ausgelagert werden. Bei mir sieht das z.B. so aus:
var
aMotor : IMotor; begin aMotor := ServiceLocator.GetService<IMotor>; aMotor.Brumm;
Delphi-Quellcode:
Mit Einbindung von uInterface braucht man in der aufrufenden Unit keine speziellen Units von Spring oder Motor einzubinden. Damit sind die Klassen vollständig entkoppelt. Das einzige Bindglied ist der DI-Container und der löst alles über Interfaces auf.
unit uInterfaces;
interface uses Classes, SysUtils, uMotor, uBlinker ; procedure DI_Build; type IMotor = uMotor.IMotor; function DI_Motor : IMotor; type IBlinker = uBlinker.IBlinker; function DI_Blinker : IBlinker; implementation uses Spring.Container, Spring.Services; procedure DI_Build; begin GlobalContainer.Build; end; function DI_Motor : IMotor; begin Result := ServiceLocator.GetService<IMotor>; end; function DI_Blinkr : IBlinker; begin Result := ServiceLocator.GetService<IBlinker>; end; Mein typischer Aufruf sieht dann bspw. so aus:
Delphi-Quellcode:
Der Spring-Container erfüllt dabei mehrere Funktionen: Er erzeugt die angeforderte Klassen, verwaltet deren Instanzen und gibt sie damit auch wieder frei. Die mitgelieferten Spring-Beispiele zeigen die weiteren Möglichkeiten. Mein Beispiel sollte nur zeigen, wie einfach der Einstieg sein kann und dass die Spring-Funktionalität sich nicht zu sehr aufdrängt.
var
aMotor : IMotor; begin aMotor := DI_Motor; aMotor.Brumm; Wofür das alles nun? Dadurch, dass an der Stelle, wo IMotor eingesetzt wird, nichts über TMotor und deren Unit bekannt sein muss, kann mann natürlich alles mögliche bereitstellen, solange es IMotor implementiert und damit die Prozedur Brumm() ausführen kann. Ganz klar auch, dass das Brummen im Motor-Teil erfolgen muss. An der konsumierenden Stelle hat man nichts über das Motor-Management zu wissen. Nun ist der Motorwechsel einfach(er) und auch der Test eines Autos mit einem anderen oder Hilfs-Motor sollte kein Problem darstellen. HTH. |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Ja, das habe ich soweit verstanden.
Bei mir hat sich aber ein anderes Problem dabei aufgetan. Um bei Deinem Beispiel zu bleiben: Es gibt jetzt eine Liste mit verschiedenen Autos und die Autos haben jeweils unterschiedliche Motoren. Bei mir ist es jetzt so, wenn ich die Motoren mit "AsSingleton" registiere, dann haben alle Autos denselben Motor. |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz