AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign [Spring4D] Automatische Service-Liste mittels ResolveAll
Thema durchsuchen
Ansicht
Themen-Optionen

[Spring4D] Automatische Service-Liste mittels ResolveAll

Ein Thema von neo4a · begonnen am 26. Mai 2014 · letzter Beitrag vom 26. Mai 2014
Antwort Antwort
neo4a

Registriert seit: 22. Jan 2007
Ort: Ingolstadt
362 Beiträge
 
Delphi XE2 Architect
 
#1

[Spring4D] Automatische Service-Liste mittels ResolveAll

  Alt 26. Mai 2014, 10:43
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:
  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>;
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.

Weder
Delphi-Quellcode:
var
  aListArray : TArray<IccApp>;
  aItem : IccApp;
begin
  aListArray := GlobalContainer.ResolveAll<iccApp>;
  for aItem in aListArray do
    ShowMessage(aItem.DisplayName);
noch
Delphi-Quellcode:
var
  aListArray : TArray<TValue>;
  aItem : TValue;
begin
  aListArray := GlobalContainer.Context.ServiceResolver.ResolveAll(TypeInfo(iccApp));
  for aItem in aListArray do
    ShowMessage(aItem.AsType<IccApp>.DisplayName);
bringen mich so richtig weiter.
Andreas

Geändert von neo4a (26. Mai 2014 um 11:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: [Spring4D] Automatische Service-Liste mittels ResolveAll

  Alt 26. Mai 2014, 11:20
Die IComponentRegistry verfügt über alle Informationen zu den Registrierungen.

Delphi-Quellcode:
container.Context.ComponentRegistry.FindAll.Where(
  function(const model: TComponentModel): Boolean
  begin
    Result := model.HasService(TypeInfo(IccApp));
  end);
Allerdings wirst du so kaum an das Ergebnis von DisplayName kommen, denn dazu benötigst du ja eine Instanz.

ResolveAll bringt auch nur solche Services zurück, die mit einem Namen registriert wurden - siehe auch Issue 21 und Issue 22.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (26. Mai 2014 um 11:23 Uhr)
  Mit Zitat antworten Zitat
neo4a

Registriert seit: 22. Jan 2007
Ort: Ingolstadt
362 Beiträge
 
Delphi XE2 Architect
 
#3

AW: [Spring4D] Automatische Service-Liste mittels ResolveAll

  Alt 26. Mai 2014, 11:42
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.
Andreas

Geändert von neo4a (26. Mai 2014 um 11:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: [Spring4D] Automatische Service-Liste mittels ResolveAll

  Alt 26. Mai 2014, 12:02
Danke, Stefan. Das bringt mich schon weiter.

Hat die Vergabe von Namen vielleicht noch weitere "magische" Effekte, die man praktisch nutzen kann?
Generell ist es so, dass:

- 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

[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.
Das Beispiel war nur, um an die Registrierungsinformationen zu kommen.

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).
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (26. Mai 2014 um 12:07 Uhr)
  Mit Zitat antworten Zitat
neo4a

Registriert seit: 22. Jan 2007
Ort: Ingolstadt
362 Beiträge
 
Delphi XE2 Architect
 
#5

AW: [Spring4D] Automatische Service-Liste mittels ResolveAll

  Alt 26. Mai 2014, 12:24
Vergib bei Implements<IccApp> einen Namen. Dann kannst du sie auch alle mit ResolveAll bekommen, so wie in deinem ersten Code Beispiel
Danke. Das funktioniert nun wirklich gut und gibt mir die Möglichkeit, Registrierungs-Infos in den Klassen zu halten.
Andreas
  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 17:46 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