Repository navigation
Expand file tree
/
Copy pathQuick.Core.Mapping.Abstractions.pas
More file actions
115 lines (90 loc) · 2.9 KB
/
Copy pathQuick.Core.Mapping.Abstractions.pas
File metadata and controls
115 lines (90 loc) · 2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
{ ***************************************************************************
Copyright (c) 2016-2026 Kike Perez
Unit : Quick.Core.Mapping.Abstractions
Description : Core Mapping Abstractions
Author : Kike Perez
Version : 1.0
Created : 22/02/2020
Modified : 02/03/2020
This file is part of QuickCore: https://github.com/exilon/QuickCore
***************************************************************************
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*************************************************************************** }
unit Quick.Core.Mapping.Abstractions;
{$i QuickCore.inc}
interface
uses
{$IFDEF DEBUG_MAPPER}
Quick.Debug.Utils,
System.TypInfo,
{$ENDIF}
System.SysUtils,
System.Rtti,
System.Generics.Collections;
type
TMapContext = class
private
fItems : TDictionary<string, TValue>;
public
constructor Create;
destructor Destroy; override;
property Items : TDictionary<string, TValue> read fItems;
end;
TMapOptionsProc = reference to procedure(aContext : TMapContext);
TMapTarget = record
type
TMapDelegate = procedure(aSrcObj, aTgtObj : TObject; aContext : TMapContext) of object;
private
fSrcObj : TObject;
fMapDelegate : TMapDelegate;
fMapContext : TMapContext;
public
constructor Create(aSrcObj : TObject; aMapDelegate : TMapDelegate; aMapContext : TMapContext = nil);
function AsType<T : class, constructor> : T;
end;
IMapper = interface
['{B64F8600-53F1-4A54-8581-1255D31E91A6}']
procedure Map(aSrcObj, aTgtObj : TObject); overload;
function Map(aSrcObj : TObject) : TMapTarget; overload;
function Map(aSrcObj : TObject; aConfigure : TMapOptionsProc) : TMapTarget; overload;
end;
implementation
{ TMapContext }
constructor TMapContext.Create;
begin
fItems := TDictionary<string, TValue>.Create;
end;
destructor TMapContext.Destroy;
begin
fItems.Free;
inherited;
end;
{ TMapTarget }
constructor TMapTarget.Create(aSrcObj : TObject; aMapDelegate : TMapDelegate;
aMapContext : TMapContext = nil);
begin
fSrcObj := aSrcObj;
fMapDelegate := aMapDelegate;
fMapContext := aMapContext;
end;
function TMapTarget.AsType<T>: T;
begin
{$IFDEF DEBUG_MAPPER}
TDebugger.TimeIt(nil,'IMapper.Map',fSrcObj.ClassName + ' to ' + TClass(T).ClassName);
{$ENDIF}
Result := T.Create;
try
fMapDelegate(fSrcObj,Result,fMapContext);
finally
fMapContext.Free;
end;
end;
end.