Spring ist nützlich, um deine Objekte zu verwalten. Du kannst hier in der Konfiguration schon angeben, dass ein Interface nur als Singleton genutzt werden kann. Dann wird jede Anforderung an dieses Objekt immer die gleiche Instanz zurückliefern. Es gibt dann noch verschiedene andere Arten z.b. SingletonPerThread (o.ä.)...
Weiterhin musst du nur die Interfaces veröffentlichen, die implementierenden Klassen können komplett im implementation-Teil "versteckt" werden.
intf.pas:
Delphi-Quellcode:
interface
type
IDatabase =
interface(IInterface)
// GUID
end;
IQuery =
interface(IInterface)
// GUID
end;
implementation
end.
dbimpl.pas:
Delphi-Quellcode:
interface
implementation
uses
Spring.Container,
intf;
type
TMyDatabase = class(TInterfacedObject, IDatabase)
//
end;
initialization
GlobalContainer.RegisterComponent<TMyDatabase>.Implements<IDatabase>.AsSingletonPerThread;
qryImpl.pas:
Delphi-Quellcode:
interface
implementation
uses
Spring.Container,
intf;
type
TMyQuery = class(TInterfacedObject, IQuery)
//...
public
constructor Create(const database: IDatabase); retintroduce;
end;
initialization
GlobalContainer.RegisterComponent<TMyQuery>.Implements<IQuery>;
Dann sollte man einmalig:
GlobalContainer.Build
aufrufen. Dadurch werden alle "Regeln" scharf gestellt. Fortan kannst du mit
Delphi-Quellcode:
var
qry: IQuery;
begin
qry := GlobalContainer.Resolve<IQuery>;
// mit qry arbeiten
end;
ein IQuery-Object abrufen und damit arbeiten. Spring kümmert sich automatisch um Dependencies und erzeugt nötigenfalls die Database und reicht diese auch im Konstruktor an die
Query weiter.
Gruß
schlecki