![]() |
[Spring4D] Automatische Service-Liste mittels ResolveAll
Gibt es vielleicht einen eleganten Weg, die in Spring4D automatisch registrierten Typen/Componenten wieder zu listen, ohne eine zusätzliche Info-Struktur vorhalten zu müssen?
Mein modulares Programm hat folgende Struktur:
Delphi-Quellcode:
Nun hätte ich gern die Möglichkeit, die auf diese Weise registrierten Typen nach Bedarf wieder "einzusammeln" und z.B. in einer Liste alle Services aufzuführen, die IccApp implementieren.
IccApp = interface
['{D91CB460-F196-43C9-8633-4E5759164FB8}'] function DisplayName : string; end; IccTestApp = interface(iccApp) ['{2CAC3397-B984-45BE-B255-56E5FD6220F5}'] function BackstageView: TBackstageView; function ColorSchemeAccent : TColorSchemeAccent; end; TccApp_BackstageTest = class(TInterfacedObject, IccTestApp, IccApp) //das benötigt Spring4D, sonst gibt's einen Fehler private FBackstageBaseFormTest : TBackStageVM; private function DisplayName : string; function BackstageView: TBackstageView; function ColorSchemeAccent : TColorSchemeAccent; public constructor Create; destructor Destroy; override; end; initialization GlobalContainer.RegisterType<TccApp_BackstageTest>.Implements<IccTestApp>.Implements<IccApp>; Weder
Delphi-Quellcode:
noch
var
aListArray : TArray<IccApp>; aItem : IccApp; begin aListArray := GlobalContainer.ResolveAll<iccApp>; for aItem in aListArray do ShowMessage(aItem.DisplayName);
Delphi-Quellcode:
bringen mich so richtig weiter.
var
aListArray : TArray<TValue>; aItem : TValue; begin aListArray := GlobalContainer.Context.ServiceResolver.ResolveAll(TypeInfo(iccApp)); for aItem in aListArray do ShowMessage(aItem.AsType<IccApp>.DisplayName); |
AW: [Spring4D] Automatische Service-Liste mittels ResolveAll
Die
Delphi-Quellcode:
verfügt über alle Informationen zu den Registrierungen.
IComponentRegistry
Delphi-Quellcode:
Allerdings wirst du so kaum an das Ergebnis von DisplayName kommen, denn dazu benötigst du ja eine Instanz.
container.Context.ComponentRegistry.FindAll.Where(
function(const model: TComponentModel): Boolean begin Result := model.HasService(TypeInfo(IccApp)); end); ResolveAll bringt auch nur solche Services zurück, die mit einem Namen registriert wurden - siehe auch ![]() ![]() |
AW: [Spring4D] Automatische Service-Liste mittels ResolveAll
Danke, Stefan. Das bringt mich schon weiter.
Hat die Vergabe von Namen vielleicht noch weitere "magische" Effekte, die man praktisch nutzen kann? [Edit] Ich komme doch nicht allein weiter. Kannst Du bitte Dein obiges Code-Schnipsel exemplarisch so erweitern, dass eine Service-Instanz erstellt wird, deren Properties (z.B. DisplayName) dann zur weiteren Verfügung stehen. |
AW: [Spring4D] Automatische Service-Liste mittels ResolveAll
Zitat:
- Resolve() die Default Registrierung zurückliefert - gibt es keine, wird eine Exception ausgelöst - ResolveAll() alle Registrierungen mit Namen zurückliefert - gibt es keine, kommt ein leeres Ergebnis zurück Eine Default Registrierung ist: - die letzte Registrierung ohne Namen oder mit Angabe von .AsDefault Zitat:
Vergib bei Implements<IccApp> einen Namen. Dann kannst du sie auch alle mit ResolveAll bekommen, so wie in deinem ersten Code Beispiel, was ich auch der empfohlene Weg ist (der ServiceResolver wird in Zukunft nämlich wegfallen, weil er mit dem DependencyResolver zusammen gelegt wird). |
AW: [Spring4D] Automatische Service-Liste mittels ResolveAll
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 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