![]() |
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:
Das zweite
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.
Delphi-Quellcode:
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?
Implements
Als Behelfslösung habe ich es nun einfach in zwei Container aufgespalten, aber das kann es wahrscheinlich nicht gewesen sein... |
AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi
Da wirst Du vermutlich direkt in einem
![]() ![]() 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: ![]() 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; .... |
AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi
Da gabs doch erst neulich nen
![]() 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. |
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
|
AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi
Zitat:
|
AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi
Zitat:
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. |
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 ;-) |
AW: Spring4D: Warum kann ein Typ nicht unter dem selben Namen zwei Interfaces realisi
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 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