mirror of https://gitlab.com/basile.b/dexed.git
added SingleService interface system to EntitiesConnector
This commit is contained in:
parent
18f7237236
commit
5aa4068990
|
@ -9,6 +9,16 @@ uses
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
|
(**
|
||||||
|
* interface for a single Coedit service (many to one relation).
|
||||||
|
* A service is valid during the whole application life-time and
|
||||||
|
* is mostly designed to avoid messy uses clauses or to limit
|
||||||
|
* the visibility of the implementer methods.
|
||||||
|
*)
|
||||||
|
ICESingleService = interface
|
||||||
|
function singleServiceName: string;
|
||||||
|
end;
|
||||||
|
|
||||||
(**
|
(**
|
||||||
* Manages the connections between the observers and their subjects in the whole program.
|
* Manages the connections between the observers and their subjects in the whole program.
|
||||||
*)
|
*)
|
||||||
|
@ -16,6 +26,7 @@ type
|
||||||
private
|
private
|
||||||
fObservers: TObjectList;
|
fObservers: TObjectList;
|
||||||
fSubjects: TObjectList;
|
fSubjects: TObjectList;
|
||||||
|
fServices: TObjectList;
|
||||||
fUpdatesCount: Integer;
|
fUpdatesCount: Integer;
|
||||||
procedure tryUpdate;
|
procedure tryUpdate;
|
||||||
procedure updateEntities;
|
procedure updateEntities;
|
||||||
|
@ -34,15 +45,20 @@ type
|
||||||
procedure addSubject(aSubject: TObject);
|
procedure addSubject(aSubject: TObject);
|
||||||
procedure removeObserver(anObserver: TObject);
|
procedure removeObserver(anObserver: TObject);
|
||||||
procedure removeSubject(aSubject: TObject);
|
procedure removeSubject(aSubject: TObject);
|
||||||
|
// allow to register a single service provider.
|
||||||
|
procedure addSingleService(aServiceProvider: TObject);
|
||||||
|
// allow to retrieve a single service provider based on its interface name
|
||||||
|
function getSingleService(const aName: string): TObject;
|
||||||
// should be tested before forceUpdate()
|
// should be tested before forceUpdate()
|
||||||
property isUpdating: boolean read getIsUpdating;
|
property isUpdating: boolean read getIsUpdating;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(**
|
(**
|
||||||
* Interface for a Coedit subject. Basically designed to hold a list of observer
|
* Interface for a Coedit subject. Basically designed to hold a list of observer
|
||||||
*)
|
*)
|
||||||
ICESubject = interface
|
ICESubject = interface
|
||||||
['ICESubject']
|
|
||||||
// an observer is proposed. anObserver is not necessarly compatible.
|
// an observer is proposed. anObserver is not necessarly compatible.
|
||||||
procedure addObserver(anObserver: TObject);
|
procedure addObserver(anObserver: TObject);
|
||||||
// anObserver must be removed.
|
// anObserver must be removed.
|
||||||
|
@ -87,6 +103,7 @@ constructor TCEEntitiesConnector.create;
|
||||||
begin
|
begin
|
||||||
fObservers := TObjectList.create(false);
|
fObservers := TObjectList.create(false);
|
||||||
fSubjects := TObjectList.create(false);
|
fSubjects := TObjectList.create(false);
|
||||||
|
fServices := TObjectList.create(false);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TCEEntitiesConnector.destroy;
|
destructor TCEEntitiesConnector.destroy;
|
||||||
|
@ -176,10 +193,34 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCEEntitiesConnector.removeSubject(aSubject: TObject);
|
procedure TCEEntitiesConnector.removeSubject(aSubject: TObject);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
fSubjects.Remove(aSubject);
|
fSubjects.Remove(aSubject);
|
||||||
tryUpdate;
|
tryUpdate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCEEntitiesConnector.addSingleService(aServiceProvider: TObject);
|
||||||
|
begin
|
||||||
|
if fServices.IndexOf(aServiceProvider) <> -1 then
|
||||||
|
exit;
|
||||||
|
if not (aServiceProvider is ICESingleService) then
|
||||||
|
exit;
|
||||||
|
fServices.Add(aServiceProvider);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TCEEntitiesConnector.getSingleService(const aName: string): TObject;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
serv: ICESingleService;
|
||||||
|
begin
|
||||||
|
result := nil;
|
||||||
|
for i := 0 to fServices.Count-1 do
|
||||||
|
begin
|
||||||
|
serv := fServices[i] as ICESingleService;
|
||||||
|
if serv.singleServiceName = aName then
|
||||||
|
exit(fServices[i]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
{$ENDREGION}
|
{$ENDREGION}
|
||||||
|
|
||||||
{$REGION TCECustomSubject ------------------------------------------------------}
|
{$REGION TCECustomSubject ------------------------------------------------------}
|
||||||
|
|
Loading…
Reference in New Issue