![]() |
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:
In der DPR habe ich alle die konkreten implementierungs Units und alle Interface Units drin und das
GlobalContainer.RegisterType<TMyLayer1>.Implements<IMyLayer1>('layer1').InjectConstructor(['Layer2']);
hier im Uses:
Delphi-Quellcode:
und in implementation:
Spring.Container,
Spring.Services, Spring.Collections
Delphi-Quellcode:
Mit dem Debugger kann ich nachweisen, dass beim Laden der DLL alle diese RegisterType Aufrufe und
GlobalContainer.Build;
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:
Was kommt ist diese Exception:
function MyDoIt:Boolean;
var Layer1: IMyLayer1; begin Layer1 := ServiceLocator.GetService<TMyLayer1>; Fehler in MyDoIt: Cannot resolve type: TMyLayer1 Die kommt auch wenn ich GetService<IMyLayer1> aufrufe. Woran liegt das? Grüße TurboMagic |
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. |
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. |
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 |
AW: Spring4D DI-Container Exception
Bitte poste einfach das komplette Programm, alles andere find ich zu mühsam und unproduktiv für beide Seiten.
|
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 |
AW: Spring4D DI-Container Exception
Zitat:
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. |
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 |
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: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:01 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 by Thomas Breitkreuz