![]() |
Spring-DI / DelegatedConstructor / Factory für Dummies
Ich habe keine Erfahrung mit Interfaces, könnte mir aber inzwischen vorstellen, im nächsten Projekt mit solchen zu arbeiten.
Der Mehraufwand beim definieren der genutzen Klassen (durch zusätzliche Deklaration von Interfaces) und beim Erzeugen der Objekte (durch Zuweisung des Objektes an eine Interfacevariable) lässt sich durch eine bessere Strukturierung des Projektes rechtfertigen. Wenn man dann die Objekte noch an einer zetralen Stelle erzeugen lässt und dann nur noch mit deren Schnittstellen arbeitet, hört sich das schon interessant an. In dem Sinne habe ich verschiedenes nachgelesen, bekomme aber (mal wieder) nicht alles unter einen Hut. Insbesondere konnte ich noch nicht klar verinnerlichen, wozu dieses Spring-Framework nun eigentlich gut ist. Dann erschließt sich mir nicht der Sinn eines DelegatedConstructor (ich kann doch auch später einem Objekt ein anderes als Property zuweisen). Und wie wird eine Factory i.d.R. eingesetzt? Zwar habe ich von allem eine ungefähre Ahnung bekommen, aber der Geistesblitz blieb noch aus.:roll: Wollt Ihr Euch mal hier zu dem Themenbereich austoben? |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Spring ist nützlich, um deine Objekte zu verwalten. Du kannst hier in der Konfiguration schon angeben, dass ein Interface nur als Singleton genutzt werden kann. Dann wird jede Anforderung an dieses Objekt immer die gleiche Instanz zurückliefern. Es gibt dann noch verschiedene andere Arten z.b. SingletonPerThread (o.ä.)...
Weiterhin musst du nur die Interfaces veröffentlichen, die implementierenden Klassen können komplett im implementation-Teil "versteckt" werden. intf.pas:
Delphi-Quellcode:
dbimpl.pas:
interface
type IDatabase = interface(IInterface) // GUID end; IQuery = interface(IInterface) // GUID end; implementation end.
Delphi-Quellcode:
qryImpl.pas:
interface
implementation uses Spring.Container, intf; type TMyDatabase = class(TInterfacedObject, IDatabase) // end; initialization GlobalContainer.RegisterComponent<TMyDatabase>.Implements<IDatabase>.AsSingletonPerThread;
Delphi-Quellcode:
interface
implementation uses Spring.Container, intf; type TMyQuery = class(TInterfacedObject, IQuery) //... public constructor Create(const database: IDatabase); retintroduce; end; initialization GlobalContainer.RegisterComponent<TMyQuery>.Implements<IQuery>; Dann sollte man einmalig:
Delphi-Quellcode:
aufrufen. Dadurch werden alle "Regeln" scharf gestellt. Fortan kannst du mit
GlobalContainer.Build
Delphi-Quellcode:
ein IQuery-Object abrufen und damit arbeiten. Spring kümmert sich automatisch um Dependencies und erzeugt nötigenfalls die Database und reicht diese auch im Konstruktor an die Query weiter.
var
qry: IQuery; begin qry := GlobalContainer.Resolve<IQuery>; // mit qry arbeiten end; Gruß schlecki |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
Spring ruft beim (internen) Instantiieren von TMyDatabase den Konstruktor ohne Parameter auf. Wenn das nicht geht, muss man bei
Delphi-Quellcode:
noch Spring mitteilen, welcher Konstruktor verwendet werden soll. Hier kommt der DelegatedConstructor in's Spiel:
GlobalContainer.RegisterComponent<TMyDatabase>.Implements<IDatabase>.AsSingletonPerThread
Delphi-Quellcode:
Ansonsten ist das Spring-Framework mehr als nur ein DI-Container. Der ist aber der wichtigste Teil. Du weißt ja, dass DI (Dependency Injection) dazu führt, praktisch keine Objekte, die komplexer sind als etwa TStringList, mehr in der Klasse selbst zu erzeugen. Stattdessen bekommt die Klasse die notwendigen Instanzen der erforderlichen Klassen von "außen" zugewiesen.
GlobalContainer.RegisterComponent<TMyDatabase>.Implements<IDatabase>.AsSingletonPerThread.DelegateTo(
function: TMyDatabase begin Result := TMyDatabase.Create(nil); end ) Zitat:
So gesehen führt DI zu testbaren Code führt zu Clean-Code führt in den Programmierer-Himmel. ;) |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Ich kann in diesem Bezug nur auf
![]() Auch lohnt es sich, ![]() |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Ok danke erst mal.
Mit dem Thema Testing tue ich mich etwas schwer. Ich habe mal zwei deutsche Seiten dazu gefunden: ![]() ![]() Ich denke, dass solche Tests nur sehr begrenzten Sinn machen. Jedenfalls sind die Probleme, die mir so unterkommen meist sehr komplexen Umständen geschuldet, die sich nicht mit ein paar Testobjekten reproduzieren lassen. Mal reagiert die VCL etwas anders als erwartet (was z.B. irgendwelche Nachrichtenbehandlungen betrifft) oder in meinem Framework werden irgendwann Objekte nicht wie erwartet behandelt. Jedenfalls treten die Fehler meist nur durch eine intensive Userbedienung auf. In den Fällen dürfte ein Unittesting nicht helfen. Das nur mal am Rande. Interfaces zu nutzen und vielleicht auch Spring merke ich mir aber auf jeden Fall mal vor. Muss mich aber erst noch ein bissl mehr damit beschäftigen. In meiner Turniersoftware merke ich jetzt zumindest allmählich, dass pure Objekte noch nicht wirklich das Wahre sind. Diese irgendwo zentral zu erzeugen und dann mit Interfaces weiter zu arbeiten, stelle ich mir (inzwischen) sehr übersichtlich vor. Ich werde das Projekt jetzt erst mal zum Ende bringen und später mal eine Überarbeitung andenken. |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
|
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Es ging mir um Fehler, die bei der Weiterentwicklung meiner datensensitiven Komponenten und meines Frameworks aufgetreten sind. Entweder haben die VCL-Controls (von denen ich ableite) teilweise nicht wie erwartet funktioniert oder ich habe den Ablauf meines Frameworks an irgendeiner Stelle problematisch verändert.
Diese Probleme hätte wohl kein Unit-Testing entdeckt - denke ich. Und Probleme, die ich mit einem Unit-Testing finden könnte, habe ich eigentlich nicht und wenn, sind sie eigentlich schnell zu bereinigen. |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
|
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Ok, in Bezug auf die Teamarbeit ist das gewissermaßen schon nachvollziehbar. Damit habe ich aber (leider oder zum Glück?) keine Erfahrungen.
Die Testfälle zu organisieren ist aber sicher auch nicht trivial und kostet viel Zeit und Arbeit. Da ich immer im eigenen Saft schmore und mit meinem eiegntlichen Projekt voran kommen will, habe ich leider wenig Zeit mich mit für mich neuen Grundlagen zu befassen. Im nächsten Leben werde ich mal bei Dir Azubi und lerne das gleich richtig. :-) |
AW: Spring-DI / DelegatedConstructor / Factory für Dummies
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 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