Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Spring4D DI-Container Exception (https://www.delphipraxis.net/207368-spring4d-di-container-exception.html)

TurboMagic 17. Mär 2021 15:29

Spring4D DI-Container Exception
 
Hallo,

ich versuche gerade mittels Nick Hodge's "Coding in Delphi" Buch den DI-Container von Spring4D
für mein DLL Projekt zu nutzen, allerdings noch ohne Erfolg.

Ich habe die Situation in der es mehrere Layer gibt. Jeder Layer ist eine Klasse mit einem in
einer extra Unit befindlichen Interface. Jeder der Konstruktoren bekommt eine Interface Referenz
der schichtenmäßig darunter liegenden Klasse, kennt also nur das Interface, nicht die konkrete
implementierung.

In jeder konkreten Implementierungsunit habe ich im Implementation Teil Code wie diesen:

Delphi-Quellcode:
GlobalContainer.RegisterType<TMyLayer1>.Implements<IMyLayer1>('layer1').InjectConstructor(['Layer2']);
In der DPR habe ich alle die konkreten implementierungs Units und alle Interface Units drin und das
hier im Uses:

Delphi-Quellcode:
Spring.Container,
Spring.Services,
Spring.Collections
und in implementation:

Delphi-Quellcode:
GlobalContainer.Build;
Mit dem Debugger kann ich nachweisen, dass beim Laden der DLL alle diese RegisterType Aufrufe und
der Build Aufruf ausgeführt werden.

In einer function die aus der DLL exportiert wird und von einem Testprogramm aufgerufen wird
versuche ich dann das hier:

Delphi-Quellcode:
function MyDoIt:Boolean;
var
  Layer1: IMyLayer1;
begin
  Layer1 := ServiceLocator.GetService<TMyLayer1>;
Was kommt ist diese Exception:
Fehler in MyDoIt: Cannot resolve type: TMyLayer1

Die kommt auch wenn ich GetService<IMyLayer1> aufrufe.
Woran liegt das?

Grüße
TurboMagic

TurboMagic 17. Mär 2021 15:45

AW: Spring4D DI-Container Exception
 
Ein weiterer Test zeigt, dass ich aber seltsammerweise problemlos Instanzen
der darunterliegenden Ebenen bekommen kann (zumindest ein zugewiesenes Interface
bekomme ich da, mehr hab' ich auf die schnelle nicht getestet).

Ich sehe nur nicht, wass an der Layer1 Ebene anders sein soll. Die ist konstruiert
wie alle darunter liegenden auch und Schreibfehler schließe ich durch Copy & Paste
aus.

Stevie 17. Mär 2021 15:47

AW: Spring4D DI-Container Exception
 
Erstes Problem: Man kann nur als ServiceType resolven, da du IMyLayer1 als ServiceType für den ComponentType TMyLayer1 registiert hast, ist das auch nur als ILayer1 resolvebar.
Zweites Problem: IMyLayer1 in einem anderen Modul hat eine andere TypeInfo (außer du nutzt ein gemeinsames runtime package) und kann somit beim Resolve nicht gefunden werden - das ist ein mir bekanntes Problem.

Außerdem: vergiss die Unit Spring.Services und TServiceLocator einfach - resolve aus dem Container.

TurboMagic 17. Mär 2021 16:18

AW: Spring4D DI-Container Exception
 
Hallo,

danke schon mal für die erste Antwort.
Es knallt auch, wenn ich das wie ich es eigentlich will als das Interface resolve.

Was willst du mit dem Satz sagen?
"Zweites Problem: IMyLayer1 in einem anderen Modul hat eine andere TypeInfo (außer du nutzt ein gemeinsames runtime package) und
kann somit beim Resolve nicht gefunden werden - das ist ein mir bekanntes Problem."

IMyLayer ist in einer eigenen Unit deklariert die sowohl von der Unit in der TMyLayer1 implementiert wird
als auch von der, in der ich ServiceLocator.GetService<TMyLayer1>; aufrufe. Ist dort an den Stellen die Typinfo unterschiedlich?

Könnte ich das auch über den vergebenen Namen der beim Registrieren vergeben wurde auflösen lassen?
Falls ja, wie?

"Außerdem: vergiss die Unit Spring.Services und TServiceLocator einfach - resolve aus dem Container."
Das sagt mir noch nix, bin Spring4D Neuling...

Grüße
TurboMagic

Stevie 17. Mär 2021 17:52

AW: Spring4D DI-Container Exception
 
Bitte poste einfach das komplette Programm, alles andere find ich zu mühsam und unproduktiv für beide Seiten.

TurboMagic 18. Mär 2021 08:23

AW: Spring4D DI-Container Exception
 
Halo,

inzwischen klappt das, der Fehler lag wohl woanders und war durch die Code Struktur nicht gleich offensichtlich.
Einzig und alleine das Rätsel warum build.exe gleich das Handtuch warf wäre noch interessant gelöst zu bekommen.
Evtl. würde Buiild.exe dadurch etwas betriebssicherer...

Grüße
TurboMagic

Stevie 18. Mär 2021 11:21

AW: Spring4D DI-Container Exception
 
Zitat:

Zitat von TurboMagic (Beitrag 1485415)
Einzig und alleine das Rätsel warum build.exe gleich das Handtuch warf wäre noch interessant gelöst zu bekommen.
Evtl. würde Buiild.exe dadurch etwas betriebssicherer...

Bitte schau dir nochmal die Info in dem anderen Thread an, versuch dich in meine Lage zu versetzen, und überlege, was ich mit dieser dürftigen Info, wohl anfangen soll.
Du erwähnst einen Screenshot, den ich nicht sehe (dachte, dir fällt das noch selber auf) und das log (oder sollte das nicht geschrieben werden, den output aus der cmd) zu posten, wäre enorm hilfreich.

TurboMagic 19. Mär 2021 07:16

AW: Spring4D DI-Container Exception
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, dass der Screenshot fehlt.

Ich versuche mal die Infos zusammen zu bekommen, will aber nicht die existierende
Installation beeinträchtigen, da ich mit dem Projekt vorwärts kommen muss.

Ein Konsolenfenster geht nur < 1s auf und gleich wieder zu.

Hier die von Build.exe angezeigte Fehlermeldung:

---------------------------
Build
---------------------------
Failed to build the task: "Packages\Delphi10Rio\Spring4D.groupproj"
---------------------------
OK
---------------------------

Nach dem Log suche ich gerne nochmal mal, ich konnte es bisher aber leider nicht finden.
Ich habe im Spring4D Ordner und den Unterordnern gesucht. Wo liegt das normalerweise?

Grüße
TurboMagic

Stevie 19. Mär 2021 11:23

AW: Spring4D DI-Container Exception
 
Console sollte bei nem Haken bei "Pause after each step" offen bleiben. Logs sollten im Spring Verzeichnis im Ordner "Logs" liegen, aber da auch die cmd gleich wieder zu geht, kommt er vermutlich nichtmal bis zum msbuild Aufruf.
Kann es sein, dass du Spring in einem schreibgeschützten Verzeichnis liegen hast (also z.B. irgendwo im Delphi Verzeichnis oder so unterhalb Programfiles?)

Der Source der Build.exe ist im Repo mit drin, kannst das ja mal im Debugger laufen lassen

In BuildEngine.pas kannst du dir dort, wo exitCode <> 0 überprüft wird, mal die ausgeführte commandline ausgeben lassen und die manuell ausführen lassen, um zu schauen, was da gegen die wand fährt

Hab da gerade so ein deja vu: schau mal ob das hier weiter hilft: https://bitbucket.org/sglienke/spring4d/issues/308


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz