2
0

AutoMappingObjects.dpr 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. program AutoMappingObjects;
  2. {$APPTYPE CONSOLE}
  3. {$R *.res}
  4. uses
  5. System.SysUtils,
  6. System.Generics.Collections,
  7. Quick.Commons,
  8. Quick.Console,
  9. Quick.JSONRecord,
  10. Quick.Json.Serializer,
  11. Quick.AutoMapper;
  12. type
  13. TJob = record
  14. Name : string;
  15. DateFrom : TDateTime;
  16. DateTo : TDateTime;
  17. end;
  18. TCarType = (ctOil, ctDiesel);
  19. TAgentStatus = (stActive, stIdle, stFail);
  20. TCar = class
  21. private
  22. fModel : string;
  23. fCarType : TCarType;
  24. published
  25. property Model : string read fModel write fModel;
  26. property CarType : TCarType read fCarType write fCarType;
  27. end;
  28. TCarList = TObjectList<TCar>;
  29. TAgent = record
  30. Name : string;
  31. Status : TAgentStatus;
  32. end;
  33. TAgentList = TList<TAgent>;
  34. TUserBase = class(TJsonRecord)
  35. private
  36. fName : string;
  37. fAge : Integer;
  38. fCreationDate : TDateTime;
  39. fNumbers : TArray<Integer>;
  40. fAgent : TAgent;
  41. published
  42. property Name : string read fName write fName;
  43. property Age : Integer read fAge write fAge;
  44. property CreationDate : TDateTime read fCreationDate write fCreationDate;
  45. property Numbers : TArray<Integer> read fNumbers write fNumbers;
  46. property Agent : TAgent read fAgent write fAgent;
  47. end;
  48. TPointsList = TList<Integer>;
  49. TUser = class(TUserBase)
  50. private
  51. fId : Int64;
  52. fCash : Integer;
  53. fJob : TJob;
  54. fCar : TCar;
  55. fCarList : TCarList;
  56. fPoints : TPointsList;
  57. fAgentList : TAgentList;
  58. fTags : TArray<string>;
  59. public
  60. constructor Create;
  61. destructor Destroy; override;
  62. published
  63. property Id : Int64 read fId write fId;
  64. property Cash : Integer read fCash write fCash;
  65. property Job : TJob read fJob write fJob;
  66. property Car : TCar read fCar write fCar;
  67. property CarList : TCarList read fCarList write fCarList;
  68. property Points : TPointsList read fPoints write fPoints;
  69. property AgentList : TAgentList read fAgentList write fAgentList;
  70. property Tags : TArray<string> read fTags write fTags;
  71. end;
  72. TUser2 = class(TUserBase)
  73. private
  74. fIdUser : Int64;
  75. fJob : TJob;
  76. fMoney : Integer;
  77. fCar : TCar;
  78. fCarList : TCarList;
  79. fPoints : TPointsList;
  80. fAgentList : TAgentList;
  81. fJobName : string;
  82. public
  83. constructor Create;
  84. destructor Destroy; override;
  85. published
  86. property IdUser : Int64 read fIdUser write fIdUser;
  87. property Money : Integer read fMoney write fMoney;
  88. property Job : TJob read fJob write fJob;
  89. property Car : TCar read fCar write fCar;
  90. property CarList : TCarList read fCarList write fCarList;
  91. property Points : TPointsList read fPoints write fPoints;
  92. property AgentList : TAgentList read fAgentList write fAgentList;
  93. property JobName : string read fJobName write fJobName;
  94. end;
  95. var
  96. User : TUser;
  97. User2 : TUser2;
  98. User3 : TUser2;
  99. job : TJob;
  100. AutoMapper : TAutoMapper<TUser,TUser2>;
  101. {$IFNDEF FPC}
  102. InterfacedAutoMapper : IAutoMapper<TUser,TUser2>;
  103. {$ENDIF}
  104. { TUser }
  105. constructor TUser.Create;
  106. begin
  107. fCar := TCar.Create;
  108. fCarList := TCarList.Create(True);
  109. fPoints := TPointsList.Create;
  110. fAgentList := TAgentList.Create;
  111. fTags := [];
  112. end;
  113. destructor TUser.Destroy;
  114. begin
  115. fCar.Free;
  116. fCarList.Free;
  117. fPoints.Free;
  118. fAgentList.Free;
  119. inherited;
  120. end;
  121. { TUser2 }
  122. constructor TUser2.Create;
  123. begin
  124. fCar := TCar.Create;
  125. fCarList := TCarList.Create(True);
  126. fPoints := TPointsList.Create;
  127. fAgentList := TAgentList.Create;
  128. end;
  129. destructor TUser2.Destroy;
  130. begin
  131. fCar.Free;
  132. fCarList.Free;
  133. fPoints.Free;
  134. fAgentList.Free;
  135. inherited;
  136. end;
  137. var
  138. car : TCar;
  139. agent : TAgent;
  140. begin
  141. ReportMemoryLeaksOnShutdown := True;
  142. try
  143. User := TUser.Create;
  144. User.Id := 17;
  145. User.CreationDate := Now();
  146. User.Name := 'John Miller';
  147. User.Age := 30;
  148. User.Numbers := [1,2,3,4,5];
  149. User.Cash := 3500;
  150. job.Name := 'Designer';
  151. job.DateFrom := IncMonth(Now(),-12);
  152. job.DateTo := Now();
  153. User.Job := job;
  154. User.Car.Model := 'Ferrari';
  155. User.Car.CarType := ctOil;
  156. car := TCar.Create;
  157. car.Model := 'Ford';
  158. car.CarType := ctDiesel;
  159. User.CarList.Add(car);
  160. car := TCar.Create;
  161. car.Model := 'Nissan';
  162. car.CarType := ctDiesel;
  163. User.CarList.Add(car);
  164. User.Points.Add(77);
  165. User.Points.Add(100);
  166. User.Points.Add(30);
  167. agent.Name := 'FirstAgent';
  168. agent.Status := TAgentStatus.stIdle;
  169. User.Agent := agent;
  170. User.AgentList.Add(agent);
  171. agent.Name := 'SecondAgent';
  172. agent.Status := TAgentStatus.stFail;
  173. User.AgentList.Add(agent);
  174. User.Tags := ['Tag1','Tag2','Tag3'];
  175. //User2 := TMapper<TUser2>.Map(User);
  176. AutoMapper := TAutoMapper<TUser,TUser2>.Create;
  177. try
  178. //option1: you can define auto map different named properties (if OnDoMapping assigned customaping will be no effect)
  179. AutoMapper.CustomMapping.AddMap('Cash','Money');
  180. AutoMapper.CustomMapping.AddMap('Id','IdUser');
  181. AutoMapper.CustomMapping.AddMap('Job.Name','JobName');
  182. //option2: you can decide to modify each property manually or allow to auto someones
  183. AutoMapper.OnDoMapping := procedure(const aSrcObj : TUser; const aTargetName : string; out Value : TFlexValue)
  184. begin
  185. if aTargetName = 'Money' then Value := aSrcObj.Cash * 2
  186. else if aTargetName = 'IdUser' then Value := aSrcObj.Id;
  187. end;
  188. //option3: you can modify some properties after automapping done
  189. AutoMapper.OnAfterMapping := procedure(const aSrcObj : TUser; aTgtObj : TUser2)
  190. begin
  191. aTgtObj.Money := aSrcObj.Cash * 2;
  192. aTgtObj.IdUser := aSrcObj.Id;
  193. end;
  194. User2 := AutoMapper.Map(User);
  195. //User2 := TUser2.Create;
  196. //User.MapTo(User2);
  197. //User2.MapFrom(User);
  198. //User2 := User.Map<TUser2>;
  199. //UserClone := User.Clone as TUser;
  200. //User2 := TUser2(User.Clone);
  201. //User2 := TMapper<TUserBase>.Clone(User) as TUser2;
  202. {$IFNDEF FPC}
  203. InterfacedAutoMapper := TAutoMapper<TUser,TUser2>.Create;
  204. InterfacedAutoMapper.SetOnDoMapping(
  205. procedure(const aSrcObj : TUser; const aTargetName : string; out Value : TFlexValue)
  206. begin
  207. if aTargetName = 'Money' then Value := aSrcObj.Cash * 2
  208. else if aTargetName = 'IdUser' then Value := aSrcObj.Id;
  209. end
  210. );
  211. InterfacedAutoMapper.SetOnAfterMapping(
  212. procedure(const aSrcObj : TUser; aTgtObj : TUser2)
  213. begin
  214. aTgtObj.Money := aSrcObj.Cash * 2;
  215. aTgtObj.IdUser := aSrcObj.Id;
  216. end
  217. );
  218. user3 := InterfacedAutoMapper.Map(User);
  219. {$ENDIF}
  220. cout('COMPARE Instanced Mapper USER VS USER2',etTrace);
  221. cout('User.Id = %d / User2.IdUser = %d',[User.Id,User2.IdUser],etInfo);
  222. cout('User.CreationDate = %s / User2.CreationDate = %s',[DateTimeToStr(User.CreationDate),DateTimetoStr(User2.CreationDate)],etInfo);
  223. cout('User.Name = %s / User2.Name = %s',[User.Name,User2.Name],etInfo);
  224. cout('User.Age = %d / User2.Age = %d',[User.Age,User2.Age],etInfo);
  225. cout('User.Numbers = %d / User2.Numbers = %d',[User.Numbers[1],User2.Numbers[1]],etInfo);
  226. cout('User.Cash = %d / User2.Money = %d',[User.Cash,User2.Money],etInfo);
  227. cout('User.Job.Name = %s / User2.Job.Name = %s',[User.Job.Name,User2.Job.Name],etInfo);
  228. cout('User.Job.DateFrom = %s / User2.Job.DateFrom = %s',[DateTimeToStr(User.Job.DateFrom),DateTimeToStr(User2.Job.DateFrom)],etInfo);
  229. cout('User.Car.Model = %s / User2.Car.Model = %s',[User.Car.Model,User2.Car.Model],etInfo);
  230. {$IFNDEF FPC}
  231. cout('COMPARE Interfaced Mapper USER VS USER3',etTrace);
  232. cout('User.Id = %d / User3.IdUser = %d',[User.Id,User3.IdUser],etInfo);
  233. cout('User.CreationDate = %s / User3.CreationDate = %s',[DateTimeToStr(User.CreationDate),DateTimetoStr(User3.CreationDate)],etInfo);
  234. cout('User.Name = %s / User3.Name = %s',[User.Name,User3.Name],etInfo);
  235. cout('User.Age = %d / User3.Age = %d',[User.Age,User3.Age],etInfo);
  236. cout('User.Numbers = %d / User3.Numbers = %d',[User.Numbers[1],User3.Numbers[1]],etInfo);
  237. cout('User.Cash = %d / User3.Money = %d',[User.Cash,User3.Money],etInfo);
  238. cout('User.Job.Name = %s / User3.Job.Name = %s',[User.Job.Name,User3.Job.Name],etInfo);
  239. cout('User.Job.DateFrom = %s / User3.Job.DateFrom = %s',[DateTimeToStr(User.Job.DateFrom),DateTimeToStr(User3.Job.DateFrom)],etInfo);
  240. cout('User.Car.Model = %s / User3.Car.Model = %s',[User.Car.Model,User3.Car.Model],etInfo);
  241. {$ENDIF}
  242. cout(' ',etInfo);
  243. cout('USER AS JSON RESULT',etTrace);
  244. cout('%s',[User.ToJson],etInfo);
  245. cout(' ',etInfo);
  246. user.Free;
  247. cout('USER2 AS JSON RESULT',etTrace);
  248. cout('%s',[User2.ToJson],etInfo);
  249. {$IFNDEF FPC}
  250. cout(' ',etInfo);
  251. cout('USER3 AS JSON RESULT',etTrace);
  252. cout('%s',[User3.ToJson],etInfo);
  253. {$ENDIF}
  254. finally
  255. AutoMapper.Free;
  256. User2.Free;
  257. User3.Free;
  258. end;
  259. ConsoleWaitForEnterKey;
  260. except
  261. on E: Exception do
  262. Writeln(E.ClassName, ': ', E.Message);
  263. end;
  264. end.