Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisieren (https://www.delphipraxis.net/183239-spring4d-warum-kann-ein-typ-nicht-unter-dem-selben-namen-zwei-interfaces-realisieren.html)

Der schöne Günther 22. Dez 2014 20:09

Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisieren
 
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
Delphi-Quellcode:
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...

alda 22. Dez 2014 20:43

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi
 
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;
....

Stevie 22. Dez 2014 21:00

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi
 
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.

alda 22. Dez 2014 21:12

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi
 
Ich persönlich fand den Parameternamen "name" hier verwirrend. "servicename" wäre hier m.E. eindeutiger bzgl. der Verwendung gewesen :P

Stevie 22. Dez 2014 21:14

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

Zitat von alda (Beitrag 1284451)
Ich persönlich fand den Parameternamen "name" hier verwirrend. "servicename" wäre hier m.E. eindeutiger bzgl. der Verwendung gewesen :P

Da stimme ich dir uneingeschränkt zu und werds umnennen.

Stevie 22. Dez 2014 22:01

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

Zitat von Der schöne Günther (Beitrag 1284435)
Das zweite
Delphi-Quellcode:
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.

Der schöne Günther 22. Dez 2014 22:34

AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi
 
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 ;-)

Stevie 22. Dez 2014 23:20

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

Zitat von Der schöne Günther (Beitrag 1284464)
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 :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 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