I want to use TAurelius with Spring4D for its ease of use of ILIST<T>
I've written an Unit (see below) and wished to have the point of view Wagner if he's got enought time for it...
--Sorry for the post if you consider it too long--
(* Code sample using the unit below*
uses
Aurelius.ObjectManager,uAureliusSpringManager;
...
Procedure Test;
var
Manager:TObjectManger;
begin
...
// initialize Manager and load from DB
.....
Manager.FindPerson.ForEach(procedure (const P:TPerson)
begin
// do whatever with current P
...
end);
...
// releas Manager
end;
(*Unit *)
unit uUtilAureliusObjectManager;
interface
uses
Aurelius.Engine.ObjectManager, Aurelius.Criteria.Base, Spring.Collections,
uDataObjects, Aurelius.Bind.Dataset, System.Generics.Collections;
type
(* *************** *)
(* TPerson *)
(* Class sample *)
(* *************** *)
TPerson = class
private
FId: Integer;
FName: String;
public
property Id: Integer read FId write FId;
property Name: String read FName write FName;
end;
(* *************** *)
(* TIListObject *)
(* Class Conversion TListObject<T> toward ILIST<T>)
(**************** *)
TIListObject < T: class >= class(TObjectList<T>)
function ILIST: ILIST<T>;
function Enumeration: IEnumerable<T>;
class function ObjectListToIList(aListe: TObjectList<T>): ILIST<T>;
end;
(* *************** *)
(* TAureliusDatasetEx *)
(* Class Helper to use ILIST with TAureliusDataset *)
(* *************** *)
TAureliusDatasetEx = class helper
for TAureliusDataset
procedure Ilist2ObjectList<E: class>(SourceList: ILIST<E>;
var aListe: TObject);
end;
(* *************** *)
(* TCriteriaEx *)
(* Customizing TCriteria *)
(* *************** *)
TCriteriaEx = class helper
for TCriteria private
function GetIList<E: class>: ILIST<E>;
public
function ListePersons: ILIST<TPerson>;
end;
(* *************** *)
(* TCriteriaPerson *)
(* TCriteria upon TPerson class *)
(* *************** *)
TCriterePerson = TCriteria<TPerson>;
(* *************** *)
(* TObjectManagerEx *)
(* Class Helper to directly use customised TCriteria *)
(* *************** *)
TObjectManagerEx = class helper
for TObjectManager
function FindPerson: TCriterePerson;
end;
implementation
(* *************** *)
(* TObjectManagerEx *)
(* Class Helper to directly use customised TCriteria *)
(* *************** *)
function TObjectManagerEx.FindPerson: TCriterePerson;
begin
result := TCriterePerson(Self.CreateCriteria<TPerson>);
end;
{ TCriterePerson }
function TObjectManagerEx.FindPerson: TCriterePerson;
begin
result := Self.CreateCriteria<TPerson> as TCriterePerson;
end;
{ TCriteriaEx }
function TCriteriaEx.GetIList<E>: ILIST<E>;
begin
result := uUtileSpring.TIListObject<E>.ObjectListToIList(Self.List<E>);
end;
function TCriteriaEx.ListePersons: ILIST<TPerson>;
begin
result := GetIList<TPerson>;
end;
{ TAureliusDatasetEx }
procedure TAureliusDatasetEx.Ilist2ObjectList<E>(SourceList: ILIST<E>;
var aListe: TObject);
var
A: TArray<E>;
LO: TObjectList<E>;
begin
if Assigned(aListe) then
aListe.DisposeOf;
SetLength(A, SourceList.Count);
A := SourceList.ToArray;
LO := TObjectList<E>.Create(FALSE);
LO.AddRange(A);
Self.SetSourceList(LO);
aListe := LO;
end;
{ TIListObject<T> }
function TIListObject<T>.Enumeration: IEnumerable<T>;
begin
result := Self.ILIST;
end;
function TIListObject<T>.ILIST: ILIST<T>;
var
Item: T;
E: IEnumerable<T>;
A: TArray<T>;
begin
SetLength(A, Self.Count);
A := Self.ToArray;
result := TCollections.CreateObjectList<T>(A, FALSE);
end;
class function TIListObject<T>.ObjectListToIList(aListe: TObjectList<T>)
: ILIST<T>;
var
A: TArray<T>;
begin
SetLength(A, aListe.Count);
A := aListe.ToArray;
result := TCollections.CreateObjectList<T>(A, aListe.OwnsObjects);
if not aListe.OwnsObjects then
aListe.Free;
end;
end.
interface
uses
Aurelius.Engine.ObjectManager, Aurelius.Criteria.Base, Spring.Collections,
uDataObjects, Aurelius.Bind.Dataset, System.Generics.Collections;
type
(* *************** *)
(* TPerson *)
(* Class sample *)
(* *************** *)
TPerson = class
private
FId: Integer;
FName: String;
public
property Id: Integer read FId write FId;
property Name: String read FName write FName;
end;
(* *************** *)
(* TIListObject *)
(* Class Conversion TListObject<T> toward ILIST<T>)
(**************** *)
TIListObject < T: class >= class(TObjectList<T>)
function ILIST: ILIST<T>;
function Enumeration: IEnumerable<T>;
class function ObjectListToIList(aListe: TObjectList<T>): ILIST<T>;
end;
(* *************** *)
(* TAureliusDatasetEx *)
(* Class Helper to use ILIST with TAureliusDataset *)
(* *************** *)
TAureliusDatasetEx = class helper
for TAureliusDataset
procedure Ilist2ObjectList<E: class>(SourceList: ILIST<E>;
var aListe: TObject);
end;
(* *************** *)
(* TCriteriaEx *)
(* Customizing TCriteria *)
(* *************** *)
TCriteriaEx = class helper
for TCriteria private
function GetIList<E: class>: ILIST<E>;
public
function ListePersons: ILIST<TPerson>;
end;
(* *************** *)
(* TCriteriaPerson *)
(* TCriteria upon TPerson class *)
(* *************** *)
TCriterePerson = TCriteria<TPerson>;
(* *************** *)
(* TObjectManagerEx *)
(* Class Helper to directly use customised TCriteria *)
(* *************** *)
TObjectManagerEx = class helper
for TObjectManager
function FindPerson: TCriterePerson;
end;
implementation
(* *************** *)
(* TObjectManagerEx *)
(* Class Helper to directly use customised TCriteria *)
(* *************** *)
function TObjectManagerEx.FindPerson: TCriterePerson;
begin
result := TCriterePerson(Self.CreateCriteria<TPerson>);
end;
{ TCriterePerson }
function TObjectManagerEx.FindPerson: TCriterePerson;
begin
result := Self.CreateCriteria<TPerson> as TCriterePerson;
end;
{ TCriteriaEx }
function TCriteriaEx.GetIList<E>: ILIST<E>;
begin
result := uUtileSpring.TIListObject<E>.ObjectListToIList(Self.List<E>);
end;
function TCriteriaEx.ListePersons: ILIST<TPerson>;
begin
result := GetIList<TPerson>;
end;
{ TAureliusDatasetEx }
procedure TAureliusDatasetEx.Ilist2ObjectList<E>(SourceList: ILIST<E>;
var aListe: TObject);
var
A: TArray<E>;
LO: TObjectList<E>;
begin
if Assigned(aListe) then
aListe.DisposeOf;
SetLength(A, SourceList.Count);
A := SourceList.ToArray;
LO := TObjectList<E>.Create(FALSE);
LO.AddRange(A);
Self.SetSourceList(LO);
aListe := LO;
end;
{ TIListObject<T> }
function TIListObject<T>.Enumeration: IEnumerable<T>;
begin
result := Self.ILIST;
end;
function TIListObject<T>.ILIST: ILIST<T>;
var
Item: T;
E: IEnumerable<T>;
A: TArray<T>;
begin
SetLength(A, Self.Count);
A := Self.ToArray;
result := TCollections.CreateObjectList<T>(A, FALSE);
end;
class function TIListObject<T>.ObjectListToIList(aListe: TObjectList<T>)
: ILIST<T>;
var
A: TArray<T>;
begin
SetLength(A, aListe.Count);
A := aListe.ToArray;
result := TCollections.CreateObjectList<T>(A, aListe.OwnsObjects);
if not aListe.OwnsObjects then
aListe.Free;
end;
end.