AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Spring4D DI-Container Exception

Ein Thema von TurboMagic · begonnen am 17. Mär 2021 · letzter Beitrag vom 19. Mär 2021
Antwort Antwort
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.824 Beiträge
 
Delphi 12 Athens
 
#1

Spring4D DI-Container Exception

  Alt 17. Mär 2021, 15:29
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:

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:

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
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.824 Beiträge
 
Delphi 12 Athens
 
#2

AW: Spring4D DI-Container Exception

  Alt 17. Mär 2021, 15:45
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Spring4D DI-Container Exception

  Alt 17. Mär 2021, 15:47
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.824 Beiträge
 
Delphi 12 Athens
 
#4

AW: Spring4D DI-Container Exception

  Alt 17. Mär 2021, 16:18
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Spring4D DI-Container Exception

  Alt 17. Mär 2021, 17:52
Bitte poste einfach das komplette Programm, alles andere find ich zu mühsam und unproduktiv für beide Seiten.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.824 Beiträge
 
Delphi 12 Athens
 
#6

AW: Spring4D DI-Container Exception

  Alt 18. Mär 2021, 08:23
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Spring4D DI-Container Exception

  Alt 18. Mär 2021, 11:21
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.824 Beiträge
 
Delphi 12 Athens
 
#8

AW: Spring4D DI-Container Exception

  Alt 19. Mär 2021, 07:16
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
Miniaturansicht angehängter Grafiken
spring4d_build.png  
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Spring4D DI-Container Exception

  Alt 19. Mär 2021, 11:23
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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (19. Mär 2021 um 11:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 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