AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Werkzeuge Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisieren
Thema durchsuchen
Ansicht
Themen-Optionen

Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisieren

Ein Thema von Der schöne Günther · begonnen am 22. Dez 2014 · letzter Beitrag vom 23. Dez 2014
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.157 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisieren

  Alt 22. Dez 2014, 21:09
Ich bin aus der ganzen IoC-Geschichte schon zu lange raus und habe viel vergessen. Es ist wahrscheinlich trivial. Warum geht folgendes nicht?

Delphi-Quellcode:
interface type
   IInterface1 = interface(IInterface)['{CA4E8F76-A514-479E-A195-725FCC04A1AB}'] end;
   IInterface2 = interface(IInterface) ['{E97AD64A-8148-47F9-96D2-5187B60EF28D}']end;

   TMyObject = class(TInterfacedObject, IInterface1, IInterface2)
      //
   end;

implementation uses Spring.Container;

initialization
   GlobalContainer().RegisterType<TMyObject>()
      .Implements<IInterface1>('MyObject')
      .Implements<IInterface2>('MyObject');
end.
Das zweite Implements wirft mir eine Exception, der Service-Name "MyObject" sei schon belegt. Ich verstehe nicht ganz, warum: Warum gilt der Name im gesamten Container? Er müsste doch nur für das Interface gelten?

Als Behelfslösung habe ich es nun einfach in zwei Container aufgespalten, aber das kann es wahrscheinlich nicht gewesen sein...
  Mit Zitat antworten Zitat
alda

Registriert seit: 24. Mär 2014
Ort: Karlsruhe
93 Beiträge
 
Delphi XE6 Architect
 
#2

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi

  Alt 22. Dez 2014, 21:43
Da wirst Du vermutlich direkt in einem Ticket oder in der Spring4D Googlegroup nachfragen müssen.

Die Registrierung via Servicename wird aktuell auf jeden Fall in einem Dictionary gespeichert und zwar mit dem Servicenamen als Key - und dementsprechend gilt dieser auch Containerweit. Hätte jetzt spontan angenommen, dass der Servicename nur innerhalb eines registrierten Typs unique ist, habe das aber bisher auch noch nicht benötigt.

Schau mal was ich gefunden habe: Klick mich
Dachte ich mir schon, konnte aber die Methoden beim überfliegen nicht finden. Gemeint sind vermutlich die zwei hier:
Delphi-Quellcode:
TContainer = class
....
function Resolve(const name: string): TValue; overload;
function Resolve(const name: string; const arguments: array of TValue): TValue; overload;
....

Geändert von alda (22. Dez 2014 um 21:53 Uhr) Grund: Googlegroup Threadlink
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi

  Alt 22. Dez 2014, 22:00
Da gabs doch erst neulich nen Ticket zu.

Und der Grund, den ich dort geschrieben habe, ist genau derselbe, wie in dem schon verlinktem Beitrag.

Ich kenn jetzt nicht alle anderen DI Container auf dieser Welt, aber bei den meisten muss der Name unique sein, sofern mir bekannt.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

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

Registriert seit: 24. Mär 2014
Ort: Karlsruhe
93 Beiträge
 
Delphi XE6 Architect
 
#4

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi

  Alt 22. Dez 2014, 22:12
Ich persönlich fand den Parameternamen "name" hier verwirrend. "servicename" wäre hier m.E. eindeutiger bzgl. der Verwendung gewesen
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi

  Alt 22. Dez 2014, 22:14
Ich persönlich fand den Parameternamen "name" hier verwirrend. "servicename" wäre hier m.E. eindeutiger bzgl. der Verwendung gewesen
Da stimme ich dir uneingeschränkt zu und werds umnennen.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi

  Alt 22. Dez 2014, 23:01
Das zweite Implements wirft mir eine Exception, der Service-Name "MyObject" sei schon belegt. Ich verstehe nicht ganz, warum: Warum gilt der Name im gesamten Container? Er müsste doch nur für das Interface gelten?

Als Behelfslösung habe ich es nun einfach in zwei Container aufgespalten, aber das kann es wahrscheinlich nicht gewesen sein...
Warum müssens unbedingt denselben Namen haben? Würde nicht 'MyObjectFoo' und 'MyObjectBar' auch gehen?
Benannte Registrierungen braucht man ja nur dann, wenn man mehrere implementierungen desselben Services hat.

Und wenn man sie dann woanders injektet und deshalb per Name referenziert, dann macht es ja nicht den Teil des Namens noch mitanzugeben, den man eh kennt, da er sich aus dem Typ ergibt.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.157 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi

  Alt 22. Dez 2014, 23:34
Danke für die Antworten allerseits, das klärt mich auf.

Ja, einen Suffix könnte ich eventuell an den Namen hängen. Aber ich glaube ich bleibe vorerst lieber bei zwei Containern
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi

  Alt 23. Dez 2014, 00:20
Danke für die Antworten allerseits, das klärt mich auf.

Ja, einen Suffix könnte ich eventuell an den Namen hängen. Aber ich glaube ich bleibe vorerst lieber bei zwei Containern
Ich kann mich des Eindrucks nicht erwehren, dass du den Container als Service Locator benutzt
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  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:21 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