소스 검색

LuObjectConverter stuff

develop
Robin Thoni 5 년 전
부모
커밋
4178122311
23개의 변경된 파일367개의 추가작업 그리고 121개의 파일을 삭제
  1. 11
    3
      .idea/.idea.luticate2/.idea/contentModel.xml
  2. 8
    7
      Luticate2.Auth.Tests/Business/ExpressionConverter/ExpressionConverterTests.cs
  3. 8
    8
      Luticate2.Auth.Tests/Business/ExpressionConverter/Objects.cs
  4. 45
    10
      Luticate2.Auth.Tests/Business/ObjectConverter/ObjectConverterTests.cs
  5. 11
    10
      Luticate2.Auth.Tests/Business/ObjectConverter/Objects.cs
  6. 12
    9
      Luticate2.Auth.Tests/RandomTests.cs
  7. 35
    0
      Luticate2.Auth/Utils/Business/Converters/LuConvertersAllocator.cs
  8. 15
    0
      Luticate2.Auth/Utils/Business/Converters/LuConvertersOptions.cs
  9. 26
    0
      Luticate2.Auth/Utils/Business/Converters/LuConvertersTypeConverter.cs
  10. 3
    2
      Luticate2.Auth/Utils/Business/Crud/LuEfCrudBusiness.cs
  11. 0
    15
      Luticate2.Auth/Utils/Business/ExpressionConverter/LuExpressionConverterOptions.cs
  12. 6
    6
      Luticate2.Auth/Utils/Business/ExpressionConverter/LuExpressionConverterVisitor.cs
  13. 3
    2
      Luticate2.Auth/Utils/Business/ExpressionConverter/LuExpressionParamReplaceVisitor.cs
  14. 3
    2
      Luticate2.Auth/Utils/Business/ObjectConverter/LuObjectConverterIdentity.cs
  15. 86
    0
      Luticate2.Auth/Utils/Business/ObjectConverter/LuObjectConverterLists.cs
  16. 19
    22
      Luticate2.Auth/Utils/Business/ObjectConverter/LuObjectConverterPoco.cs
  17. 38
    0
      Luticate2.Auth/Utils/Business/ObjectConverter/LuObjectConverterUtils.cs
  18. 12
    20
      Luticate2.Auth/Utils/Business/ObjectConverterDescriptor/LuObjectConverterDescriptor.cs
  19. 3
    2
      Luticate2.Auth/Utils/Business/ObjectConverterDescriptor/LuObjectConverterDescriptorIdentity.cs
  20. 9
    0
      Luticate2.Auth/Utils/Interfaces/ILuConvertersAllocator.cs
  21. 9
    0
      Luticate2.Auth/Utils/Interfaces/ILuConvertersTypeConverter.cs
  22. 2
    1
      Luticate2.Auth/Utils/Interfaces/ILuObjectConverter.cs
  23. 3
    2
      Luticate2.Auth/Utils/Interfaces/ILuObjectConverterDescriptor.cs

+ 11
- 3
.idea/.idea.luticate2/.idea/contentModel.xml 파일 보기

40
         <e p="Luticate2.Auth.csproj" t="IncludeRecursive" />
40
         <e p="Luticate2.Auth.csproj" t="IncludeRecursive" />
41
         <e p="Utils" t="Include">
41
         <e p="Utils" t="Include">
42
           <e p="Business" t="Include">
42
           <e p="Business" t="Include">
43
+            <e p="Converters" t="Include">
44
+              <e p="LuConvertersAllocator.cs" t="Include" />
45
+              <e p="LuConvertersOptions.cs" t="Include" />
46
+              <e p="LuConvertersTypeConverter.cs" t="Include" />
47
+            </e>
43
             <e p="Crud" t="Include">
48
             <e p="Crud" t="Include">
44
               <e p="LuEfCrudBusiness.cs" t="Include" />
49
               <e p="LuEfCrudBusiness.cs" t="Include" />
45
             </e>
50
             </e>
46
             <e p="ExpressionConverter" t="Include">
51
             <e p="ExpressionConverter" t="Include">
47
-              <e p="LuExpressionConverterOptions.cs" t="Include" />
48
               <e p="LuExpressionConverterVisitor.cs" t="Include" />
52
               <e p="LuExpressionConverterVisitor.cs" t="Include" />
49
               <e p="LuExpressionParamReplaceVisitor.cs" t="Include" />
53
               <e p="LuExpressionParamReplaceVisitor.cs" t="Include" />
50
-              <e p="LuObjectConverterIdentity.cs" t="Include" />
51
             </e>
54
             </e>
52
             <e p="Fields" t="Include">
55
             <e p="Fields" t="Include">
53
               <e p="LuFieldsExtensions.cs" t="Include" />
56
               <e p="LuFieldsExtensions.cs" t="Include" />
54
               <e p="LuPartialFieldsParser.cs" t="Include" />
57
               <e p="LuPartialFieldsParser.cs" t="Include" />
55
             </e>
58
             </e>
56
             <e p="ObjectConverter" t="Include">
59
             <e p="ObjectConverter" t="Include">
60
+              <e p="LuObjectConverterIdentity.cs" t="Include" />
61
+              <e p="LuObjectConverterLists.cs" t="Include" />
57
               <e p="LuObjectConverterPoco.cs" t="Include" />
62
               <e p="LuObjectConverterPoco.cs" t="Include" />
63
+              <e p="LuObjectConverterUtils.cs" t="Include" />
58
             </e>
64
             </e>
59
             <e p="ObjectConverterDescriptor" t="Include">
65
             <e p="ObjectConverterDescriptor" t="Include">
60
               <e p="LuObjectConverterDescriptor.cs" t="Include" />
66
               <e p="LuObjectConverterDescriptor.cs" t="Include" />
108
             <e p="LuResultException.cs" t="Include" />
114
             <e p="LuResultException.cs" t="Include" />
109
           </e>
115
           </e>
110
           <e p="Interfaces" t="Include">
116
           <e p="Interfaces" t="Include">
117
+            <e p="ILuConvertersAllocator.cs" t="Include" />
118
+            <e p="ILuConvertersTypeConverter.cs" t="Include" />
111
             <e p="ILuCrud.cs" t="Include" />
119
             <e p="ILuCrud.cs" t="Include" />
112
             <e p="ILuObjectConverter.cs" t="Include" />
120
             <e p="ILuObjectConverter.cs" t="Include" />
113
             <e p="ILuObjectConverterDescriptor.cs" t="Include" />
121
             <e p="ILuObjectConverterDescriptor.cs" t="Include" />
150
             <e p="LuFieldDboTests.cs" t="Include" />
158
             <e p="LuFieldDboTests.cs" t="Include" />
151
           </e>
159
           </e>
152
           <e p="ObjectConverter" t="Include">
160
           <e p="ObjectConverter" t="Include">
153
-            <e p="ObjectConverter.cs" t="Include" />
161
+            <e p="ObjectConverterTests.cs" t="Include" />
154
             <e p="Objects.cs" t="Include" />
162
             <e p="Objects.cs" t="Include" />
155
           </e>
163
           </e>
156
           <e p="Pagination" t="Include">
164
           <e p="Pagination" t="Include">

+ 8
- 7
Luticate2.Auth.Tests/Business/ExpressionConverter/ExpressionConverterTests.cs 파일 보기

2
 using System.Collections.Generic;
2
 using System.Collections.Generic;
3
 using System.Linq;
3
 using System.Linq;
4
 using System.Linq.Expressions;
4
 using System.Linq.Expressions;
5
+using Luticate2.Auth.Utils.Business.Converters;
5
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
6
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
6
 using Luticate2.Auth.Utils.Business.ObjectConverterDescriptor;
7
 using Luticate2.Auth.Utils.Business.ObjectConverterDescriptor;
7
 using Luticate2.Auth.Utils.Interfaces;
8
 using Luticate2.Auth.Utils.Interfaces;
29
             return serviceProvider;
30
             return serviceProvider;
30
         }
31
         }
31
 
32
 
32
-        protected LuExpressionConverterOptions GetConverterOptions()
33
+        protected LuConvertersOptions GetConverterOptions()
33
         {
34
         {
34
-            var options = new LuExpressionConverterOptions
35
+            var options = new LuConvertersOptions
35
             {
36
             {
36
                 Parameters = new Dictionary<ParameterExpression, Expression>(),
37
                 Parameters = new Dictionary<ParameterExpression, Expression>(),
37
-                Types = new Dictionary<Type, Type>
38
+                TypeConverter = new LuConvertersTypeConverter(new Dictionary<Type, Type>
38
                 {
39
                 {
39
                     {typeof(TestDbo1), typeof(TestModel1)},
40
                     {typeof(TestDbo1), typeof(TestModel1)},
40
                     {typeof(TestDbo2), typeof(TestModel2)}
41
                     {typeof(TestDbo2), typeof(TestModel2)}
41
-                }
42
+                })
42
             };
43
             };
43
             return options;
44
             return options;
44
         }
45
         }
102
         public void TestVirtualProperty1()
103
         public void TestVirtualProperty1()
103
         {
104
         {
104
             Expression<Func<TestDbo2, string>> expDbo = (x => x.NameVirtual);
105
             Expression<Func<TestDbo2, string>> expDbo = (x => x.NameVirtual);
105
-            Expression<Func<TestModel2, string>> expModel = (Param_0 => Param_0.name + " " + Param_0.name);
106
+            Expression<Func<TestModel2, string>> expModel = (Param_0 => Param_0.name == null ? "[no data]" : Param_0.name + " " + Param_0.name);
106
             var converter = GetConverter();
107
             var converter = GetConverter();
107
             var result = converter.Visit(expDbo);
108
             var result = converter.Visit(expDbo);
108
             Assert.Equal(expModel.ToString(), result?.ToString());
109
             Assert.Equal(expModel.ToString(), result?.ToString());
112
         public void TestVirtualProperty2()
113
         public void TestVirtualProperty2()
113
         {
114
         {
114
             Expression<Func<TestDbo2, string>> expDbo = (x => x.Parent.NameVirtual);
115
             Expression<Func<TestDbo2, string>> expDbo = (x => x.Parent.NameVirtual);
115
-            Expression<Func<TestModel2, string>> expModel = (Param_0 => Param_0.parent.name + " " + Param_0.parent.name);
116
+            Expression<Func<TestModel2, string>> expModel = (Param_0 => Param_0.parent.name == null ? "[no data]" : Param_0.parent.name + " " + Param_0.parent.name);
116
             var converter = GetConverter();
117
             var converter = GetConverter();
117
             var result = converter.Visit(expDbo);
118
             var result = converter.Visit(expDbo);
118
             Assert.Equal(expModel.ToString(), result?.ToString());
119
             Assert.Equal(expModel.ToString(), result?.ToString());
162
         public void TestComplexExpression2()
163
         public void TestComplexExpression2()
163
         {
164
         {
164
             Expression<Func<TestDbo2, int>> expDbo = (x => (x.NameVirtual + " " + x.Name).Length);
165
             Expression<Func<TestDbo2, int>> expDbo = (x => (x.NameVirtual + " " + x.Name).Length);
165
-            Expression<Func<TestModel2, int>> expModel = (Param_0 => (Param_0.name + " " + Param_0.name + " " + Param_0.name).Length);
166
+            Expression<Func<TestModel2, int>> expModel = (Param_0 => ((Param_0.name == null ? "[no data]" : (Param_0.name + " " + Param_0.name)) + " " + Param_0.name).Length);
166
             var converter = GetConverter();
167
             var converter = GetConverter();
167
             var result = converter.Visit(expDbo);
168
             var result = converter.Visit(expDbo);
168
             Assert.Equal(expModel.ToString(), result?.ToString());
169
             Assert.Equal(expModel.ToString(), result?.ToString());

+ 8
- 8
Luticate2.Auth.Tests/Business/ExpressionConverter/Objects.cs 파일 보기

67
     {
67
     {
68
         public LuOcdTest1()
68
         public LuOcdTest1()
69
         {
69
         {
70
-            AddMemberConverter(x => x.Id, y => y.id, PropertyType.Value);
71
-            AddMemberConverter(x => x.Name, y => y.name, PropertyType.Value);
72
-            AddMemberConverter(x => x.TestDbo2s, y => y.test_model2, PropertyType.Object);
70
+            AddMemberConverter(x => x.Id, y => y.id);
71
+            AddMemberConverter(x => x.Name, y => y.name);
72
+            AddMemberConverter(x => x.TestDbo2s, y => y.test_model2);
73
             AddStaticMethodConverter(
73
             AddStaticMethodConverter(
74
                 (Expression<Func<TestDbo1, string>>)(x => x.ToString()),
74
                 (Expression<Func<TestDbo1, string>>)(x => x.ToString()),
75
                 (Expression<Func<TestModel1, string>>)(x => x.id + ": " + x.name)
75
                 (Expression<Func<TestModel1, string>>)(x => x.id + ": " + x.name)
81
     {
81
     {
82
         public LuOcdTest2()
82
         public LuOcdTest2()
83
         {
83
         {
84
-            AddMemberConverter(x => x.Id, y => y.id, PropertyType.Value);
85
-            AddMemberConverter(x => x.Name, y => y.name, PropertyType.Value);
86
-            AddMemberConverter(x => x.NameVirtual, y => y.name + " " + y.name, PropertyType.Value);
87
-            AddMemberConverter(x => x.TestDbo1, y => y.test_model1, PropertyType.Object);
88
-            AddMemberConverter(x => x.Parent, y => y.parent, PropertyType.Object);
84
+            AddMemberConverter(x => x.Id, y => y.id);
85
+            AddMemberConverter(x => x.Name, y => y.name);
86
+            AddMemberConverter(x => x.NameVirtual, y => y.name == null ? "[no data]" : (y.name + " " + y.name));
87
+            AddMemberConverter(x => x.TestDbo1, y => y.test_model1);
88
+            AddMemberConverter(x => x.Parent, y => y.parent);
89
         }
89
         }
90
     }
90
     }
91
 }
91
 }

+ 45
- 10
Luticate2.Auth.Tests/Business/ObjectConverter/ObjectConverterTests.cs 파일 보기

1
 using System;
1
 using System;
2
+using System.Collections;
2
 using System.Collections.Generic;
3
 using System.Collections.Generic;
4
+using System.Collections.ObjectModel;
3
 using System.Linq;
5
 using System.Linq;
4
 using System.Linq.Expressions;
6
 using System.Linq.Expressions;
7
+using Luticate2.Auth.Utils.Business.Converters;
5
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
8
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
6
 using Luticate2.Auth.Utils.Business.Fields;
9
 using Luticate2.Auth.Utils.Business.Fields;
7
 using Luticate2.Auth.Utils.Business.ObjectConverter;
10
 using Luticate2.Auth.Utils.Business.ObjectConverter;
23
             var typeILuObjectConverterDescriptorEnumerable =
26
             var typeILuObjectConverterDescriptorEnumerable =
24
                 typeILuObjectConverterDescriptor.MakeGenericType(typeof(Enumerable), typeof(Enumerable));
27
                 typeILuObjectConverterDescriptor.MakeGenericType(typeof(Enumerable), typeof(Enumerable));
25
 
28
 
29
+            var typeILuObjectConverter = typeof(ILuObjectConverter<,>);
30
+            var listTypes = new []
31
+            {
32
+                typeof(IEnumerable<>),
33
+                typeof(ICollection<>),
34
+                typeof(Collection<>),
35
+                typeof(IList<>),
36
+                typeof(List<>)
37
+            };
38
+            var listImplemType = new Dictionary<Type, Type>
39
+            {
40
+                {typeof(IEnumerable<>), typeof(LuObjectConverterList)},
41
+                {typeof(ICollection<>), typeof(LuObjectConverterCollection)},
42
+                {typeof(Collection<>), typeof(LuObjectConverterCollection)},
43
+                {typeof(IList<>), typeof(LuObjectConverterList)},
44
+                {typeof(List<>), typeof(LuObjectConverterList)}
45
+            };
46
+
26
             var services = new ServiceCollection();
47
             var services = new ServiceCollection();
27
             services.AddSingleton<ILuObjectConverterDescriptorIdentity, LuObjectConverterDescriptorIdentity>();
48
             services.AddSingleton<ILuObjectConverterDescriptorIdentity, LuObjectConverterDescriptorIdentity>();
28
             services.AddSingleton(typeILuObjectConverterDescriptorEnumerable, typeof(LuObjectConverterDescriptorEnumerable));
49
             services.AddSingleton(typeILuObjectConverterDescriptorEnumerable, typeof(LuObjectConverterDescriptorEnumerable));
29
             services.AddSingleton<ILuObjectConverterDescriptor<TestDbo1, TestModel1>, LuOcdTest1>();
50
             services.AddSingleton<ILuObjectConverterDescriptor<TestDbo1, TestModel1>, LuOcdTest1>();
30
             services.AddSingleton<ILuObjectConverterDescriptor<TestDbo2, TestModel2>, LuOcdTest2>();
51
             services.AddSingleton<ILuObjectConverterDescriptor<TestDbo2, TestModel2>, LuOcdTest2>();
31
 
52
 
32
-
33
             services.AddSingleton<ILuObjectConverterIdentity, LuObjectConverterIdentity>();
53
             services.AddSingleton<ILuObjectConverterIdentity, LuObjectConverterIdentity>();
54
+            foreach (var typeFrom in listTypes)
55
+            {
56
+                foreach (var typeTo in listTypes)
57
+                {
58
+                    services.AddSingleton(typeILuObjectConverter.MakeGenericType(typeFrom, typeTo), listImplemType[typeTo]);
59
+                }
60
+            }
34
             services.AddSingleton<ILuObjectConverter<TestModel1, TestDbo1>, LuObjectConverterPoco<TestModel1, TestDbo1>>();
61
             services.AddSingleton<ILuObjectConverter<TestModel1, TestDbo1>, LuObjectConverterPoco<TestModel1, TestDbo1>>();
35
             services.AddSingleton<ILuObjectConverter<TestModel2, TestDbo2>, LuObjectConverterPoco<TestModel2, TestDbo2>>();
62
             services.AddSingleton<ILuObjectConverter<TestModel2, TestDbo2>, LuObjectConverterPoco<TestModel2, TestDbo2>>();
36
 
63
 
38
             return serviceProvider;
65
             return serviceProvider;
39
         }
66
         }
40
 
67
 
41
-        protected LuExpressionConverterOptions GetConverterOptions()
68
+        protected LuConvertersOptions GetConverterOptions()
42
         {
69
         {
43
-            var options = new LuExpressionConverterOptions
70
+            var options = new LuConvertersOptions
44
             {
71
             {
45
                 Parameters = new Dictionary<ParameterExpression, Expression>(),
72
                 Parameters = new Dictionary<ParameterExpression, Expression>(),
46
-                Types = new Dictionary<Type, Type>
73
+                TypeConverter = new LuConvertersTypeConverter(new Dictionary<Type, Type>
47
                 {
74
                 {
48
                     {typeof(TestDbo1), typeof(TestModel1)},
75
                     {typeof(TestDbo1), typeof(TestModel1)},
49
-                    {typeof(TestDbo2), typeof(TestModel2)}
50
-                },
51
-                Allocator = type =>
52
-                {
53
-                    return Activator.CreateInstance(type);
54
-                }
76
+                    {typeof(TestDbo2), typeof(TestModel2)},
77
+                    {typeof(TestModel1), typeof(TestDbo1)},
78
+                    {typeof(TestModel2), typeof(TestDbo2)}
79
+                }),
80
+                Allocator = new LuConvertersAllocator()
55
             };
81
             };
56
             return options;
82
             return options;
57
         }
83
         }
83
             Assert.NotNull(dbo);
109
             Assert.NotNull(dbo);
84
             Assert.Equal(model.id, dbo.Id);
110
             Assert.Equal(model.id, dbo.Id);
85
             Assert.Equal(model.name, dbo.Name);
111
             Assert.Equal(model.name, dbo.Name);
112
+            Assert.Equal(model.test_model2.Count, dbo.TestDbo2s.Count);
113
+            foreach (var e in model.test_model2.Zip(dbo.TestDbo2s, (model2, dbo2) => new {Model = model2, Dbo = dbo2}))
114
+            {
115
+                Assert.Equal(e.Model.id, e.Dbo.Id);
116
+                Assert.Equal(e.Model.name, e.Dbo.Name);
117
+                Assert.Equal(e.Model.name + " " + e.Model.name, e.Dbo.NameVirtual);
118
+                Assert.Equal(null, e.Dbo.Parent);
119
+                Assert.Equal(null, e.Dbo.TestDbo1);
120
+            }
86
         }
121
         }
87
     }
122
     }
88
 }
123
 }

+ 11
- 10
Luticate2.Auth.Tests/Business/ObjectConverter/Objects.cs 파일 보기

18
 
18
 
19
         public string Name { get; set; }
19
         public string Name { get; set; }
20
 
20
 
21
-//        public IList<TestDbo2> TestDbo2s { get; set; } // TODO
21
+        public IList<TestDbo2> TestDbo2s { get; set; }
22
 
22
 
23
         public string ToString()
23
         public string ToString()
24
         {
24
         {
38
 
38
 
39
         public TestDbo2 Parent { get; set; }
39
         public TestDbo2 Parent { get; set; }
40
 
40
 
41
-        public TestModel1 Unused { get; set; }
41
+        public TestDbo1 Unused { get; set; }
42
     }
42
     }
43
 
43
 
44
     public class TestModel1
44
     public class TestModel1
67
     {
67
     {
68
         public LuOcdTest1()
68
         public LuOcdTest1()
69
         {
69
         {
70
-            AddMemberConverter(x => x.Id, y => y.id, PropertyType.Value);
71
-            AddMemberConverter(x => x.Name, y => y.name, PropertyType.Value);
72
-//            AddMemberConverter(x => x.TestDbo2s, y => y.test_model2, PropertyType.Object); // TODO
70
+            AddMemberConverter(x => x.Id, y => y.id);
71
+            AddMemberConverter(x => x.Name, y => y.name);
72
+            AddMemberConverter(x => x.TestDbo2s, y => y.test_model2);
73
             AddStaticMethodConverter(
73
             AddStaticMethodConverter(
74
                 (Expression<Func<TestDbo1, string>>)(x => x.ToString()),
74
                 (Expression<Func<TestDbo1, string>>)(x => x.ToString()),
75
                 (Expression<Func<TestModel1, string>>)(x => x.id + ": " + x.name)
75
                 (Expression<Func<TestModel1, string>>)(x => x.id + ": " + x.name)
81
     {
81
     {
82
         public LuOcdTest2()
82
         public LuOcdTest2()
83
         {
83
         {
84
-            AddMemberConverter(x => x.Id, y => y.id, PropertyType.Value);
85
-            AddMemberConverter(x => x.Name, y => y.name, PropertyType.Value);
86
-            AddMemberConverter(x => x.NameVirtual, y => y.name + " " + y.name, PropertyType.Value);
87
-            AddMemberConverter(x => x.TestDbo1, y => y.test_model1, PropertyType.Object);
88
-            AddMemberConverter(x => x.Parent, y => y.parent, PropertyType.Object);
84
+            AddMemberConverter(x => x.Id, y => y.id);
85
+            AddMemberConverter(x => x.Name, y => y.name);
86
+            AddMemberConverter(x => x.NameVirtual, y => y.name + " " + y.name);
87
+            AddMemberConverter(x => x.TestDbo1, y => y.test_model1);
88
+            AddMemberConverter(x => x.Parent, y => y.parent);
89
+            AddMemberConverter((LambdaExpression) (Expression<Func<TestDbo2, TestDbo1>>) (x => x.Unused), (Expression<Func<TestModel2, TestModel1>>) (y => null));
89
         }
90
         }
90
     }
91
     }
91
 }
92
 }

+ 12
- 9
Luticate2.Auth.Tests/RandomTests.cs 파일 보기

1
-namespace Luticate2.Auth.Tests
1
+using Luticate2.Auth.Utils.Business.ObjectConverter;
2
+using Xunit;
3
+
4
+namespace Luticate2.Auth.Tests
2
 {
5
 {
3
     public class RandomTests
6
     public class RandomTests
4
     {
7
     {
40
 //            services.TryAddSingleton<ILuExpressionConverter<TTypeFrom>, TTypeImpl>();
43
 //            services.TryAddSingleton<ILuExpressionConverter<TTypeFrom>, TTypeImpl>();
41
 //        }
44
 //        }
42
 
45
 
43
-//        [Fact]
44
-//        public void Test()
45
-//        {
46
-////            var parentScopeVar = new TestDbo1();
47
-////            Expression<Func<TestDbo2, Guid>> expDbo = (x => parentScopeVar.Id);
48
-////            var type = typeof(ILuObjectConverterDescriptor<,>);
49
-////            var gtype = type.MakeGenericType(typeof(int), typeof(Enumerable));
50
-//        }
46
+        [Fact]
47
+        public void Test()
48
+        {
49
+//            var parentScopeVar = new TestDbo1();
50
+//            Expression<Func<TestDbo2, Guid>> expDbo = (x => parentScopeVar.Id);
51
+//            var type = typeof(ILuObjectConverterDescriptor<,>);
52
+//            var gtype = type.MakeGenericType(typeof(int), typeof(Enumerable));
53
+        }
51
 
54
 
52
     }
55
     }
53
 }
56
 }

+ 35
- 0
Luticate2.Auth/Utils/Business/Converters/LuConvertersAllocator.cs 파일 보기

1
+using System;
2
+using System.Collections;
3
+using System.Collections.Generic;
4
+using System.Collections.ObjectModel;
5
+using Luticate2.Auth.Utils.Interfaces;
6
+
7
+namespace Luticate2.Auth.Utils.Business.Converters
8
+{
9
+    public class LuConvertersAllocator : ILuConvertersAllocator
10
+    {
11
+        protected static IDictionary<Type, Type> listTypes = new Dictionary<Type, Type>
12
+        {
13
+            {typeof(IEnumerable<>), typeof(List<>)},
14
+            {typeof(ICollection<>), typeof(Collection<>)},
15
+            {typeof(Collection<>), typeof(Collection<>)},
16
+            {typeof(IList<>), typeof(List<>)},
17
+            {typeof(List<>), typeof(List<>)}
18
+        };
19
+
20
+        public object GetInstance(Type type)
21
+        {
22
+            if (type.IsGenericType)
23
+            {
24
+                var gtype = type.GetGenericTypeDefinition();
25
+
26
+                if (listTypes.ContainsKey(gtype))
27
+                {
28
+                    var glistType = listTypes[gtype].MakeGenericType(type.GenericTypeArguments[0]);
29
+                    return Activator.CreateInstance(glistType);
30
+                }
31
+            }
32
+            return Activator.CreateInstance(type);
33
+        }
34
+    }
35
+}

+ 15
- 0
Luticate2.Auth/Utils/Business/Converters/LuConvertersOptions.cs 파일 보기

1
+using System.Collections.Generic;
2
+using System.Linq.Expressions;
3
+using Luticate2.Auth.Utils.Interfaces;
4
+
5
+namespace Luticate2.Auth.Utils.Business.Converters
6
+{
7
+    public class LuConvertersOptions
8
+    {
9
+        public IDictionary<ParameterExpression, Expression> Parameters { get; set; }
10
+
11
+        public ILuConvertersTypeConverter TypeConverter { get; set; }
12
+
13
+        public ILuConvertersAllocator Allocator { get; set; }
14
+    }
15
+}

+ 26
- 0
Luticate2.Auth/Utils/Business/Converters/LuConvertersTypeConverter.cs 파일 보기

1
+using System;
2
+using System.Collections.Generic;
3
+using Luticate2.Auth.Utils.Interfaces;
4
+
5
+namespace Luticate2.Auth.Utils.Business.Converters
6
+{
7
+    public class LuConvertersTypeConverter : ILuConvertersTypeConverter
8
+    {
9
+        protected IDictionary<Type, Type> Types { get; set; }
10
+
11
+        public LuConvertersTypeConverter(IDictionary<Type, Type> types)
12
+        {
13
+            Types = types;
14
+        }
15
+
16
+        public Type ConvertType(Type typeFrom)
17
+        {
18
+            if (Types.ContainsKey(typeFrom))
19
+            {
20
+                return Types[typeFrom];
21
+            }
22
+
23
+            return typeFrom;
24
+        }
25
+    }
26
+}

+ 3
- 2
Luticate2.Auth/Utils/Business/Crud/LuEfCrudBusiness.cs 파일 보기

2
 using System.Collections.Generic;
2
 using System.Collections.Generic;
3
 using System.Linq;
3
 using System.Linq;
4
 using System.Linq.Expressions;
4
 using System.Linq.Expressions;
5
+using Luticate2.Auth.Utils.Business.Converters;
5
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
6
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
6
 using Luticate2.Auth.Utils.Dbo;
7
 using Luticate2.Auth.Utils.Dbo;
7
 using Luticate2.Auth.Utils.Dbo.Fields;
8
 using Luticate2.Auth.Utils.Dbo.Fields;
78
         {
79
         {
79
             var lamdbaDbo = (Expression<Func<TDbo, bool>>) filter.Expression;
80
             var lamdbaDbo = (Expression<Func<TDbo, bool>>) filter.Expression;
80
 
81
 
81
-            var options = new LuExpressionConverterOptions
82
+            var options = new LuConvertersOptions
82
             {
83
             {
83
                 Parameters = new Dictionary<ParameterExpression, Expression>(), // TODO
84
                 Parameters = new Dictionary<ParameterExpression, Expression>(), // TODO
84
-                Types = null // TODO
85
+                TypeConverter = null // TODO
85
             };
86
             };
86
             var converter = new LuExpressionConverterVisitor(options, ServiceProvider);
87
             var converter = new LuExpressionConverterVisitor(options, ServiceProvider);
87
             var lamdbaModel = converter.Visit(lamdbaDbo) as Expression<Func<TModel, bool>>;// TODO Handle errors
88
             var lamdbaModel = converter.Visit(lamdbaDbo) as Expression<Func<TModel, bool>>;// TODO Handle errors

+ 0
- 15
Luticate2.Auth/Utils/Business/ExpressionConverter/LuExpressionConverterOptions.cs 파일 보기

1
-using System;
2
-using System.Collections.Generic;
3
-using System.Linq.Expressions;
4
-
5
-namespace Luticate2.Auth.Utils.Business.ExpressionConverter
6
-{
7
-    public class LuExpressionConverterOptions
8
-    {
9
-        public IDictionary<ParameterExpression, Expression> Parameters { get; set; }
10
-
11
-        public IDictionary<Type, Type> Types { get; set; }
12
-
13
-        public Func<Type, object> Allocator { get; set; }
14
-    }
15
-}

+ 6
- 6
Luticate2.Auth/Utils/Business/ExpressionConverter/LuExpressionConverterVisitor.cs 파일 보기

2
 using System.Collections.Generic;
2
 using System.Collections.Generic;
3
 using System.Linq;
3
 using System.Linq;
4
 using System.Linq.Expressions;
4
 using System.Linq.Expressions;
5
+using Luticate2.Auth.Utils.Business.Converters;
5
 using Luticate2.Auth.Utils.Business.Utils;
6
 using Luticate2.Auth.Utils.Business.Utils;
6
 using Luticate2.Auth.Utils.Dbo;
7
 using Luticate2.Auth.Utils.Dbo;
7
 using Luticate2.Auth.Utils.Dbo.Result;
8
 using Luticate2.Auth.Utils.Dbo.Result;
12
 {
13
 {
13
     public class LuExpressionConverterVisitor : ExpressionVisitor
14
     public class LuExpressionConverterVisitor : ExpressionVisitor
14
     {
15
     {
15
-        public LuExpressionConverterOptions Options { get; }
16
+        public LuConvertersOptions Options { get; }
16
 
17
 
17
         protected IServiceProvider ServiceProvider { get; }
18
         protected IServiceProvider ServiceProvider { get; }
18
 
19
 
19
-        public LuExpressionConverterVisitor(LuExpressionConverterOptions options, IServiceProvider serviceProvider)
20
+        public LuExpressionConverterVisitor(LuConvertersOptions options, IServiceProvider serviceProvider)
20
         {
21
         {
21
             Options = options;
22
             Options = options;
22
             ServiceProvider = serviceProvider;
23
             ServiceProvider = serviceProvider;
163
             else if (currentExp is MemberExpression memberExpression)
164
             else if (currentExp is MemberExpression memberExpression)
164
             {
165
             {
165
                 var typeFrom = memberExpression.Member.DeclaringType;
166
                 var typeFrom = memberExpression.Member.DeclaringType;
166
-                var typeTo = Options.Types.ContainsKey(typeFrom) ? Options.Types[typeFrom] : typeFrom;
167
+                var typeTo = Options.TypeConverter.ConvertType(typeFrom);
167
 
168
 
168
                 var convertResult = ConvertMemberExpression(memberExpression, null, typeTo);
169
                 var convertResult = ConvertMemberExpression(memberExpression, null, typeTo);
169
                 if (!convertResult)
170
                 if (!convertResult)
176
             else if (currentExp is MethodCallExpression methodCallExpression)
177
             else if (currentExp is MethodCallExpression methodCallExpression)
177
             {
178
             {
178
                 var typeFrom = methodCallExpression.Method.DeclaringType;
179
                 var typeFrom = methodCallExpression.Method.DeclaringType;
179
-                var typeTo = Options.Types.ContainsKey(typeFrom) ? Options.Types[typeFrom] : typeFrom;
180
+                var typeTo = Options.TypeConverter.ConvertType(typeFrom);
180
 
181
 
181
                 var convertResult = ConvertMethodCallExpression(methodCallExpression, null, typeTo);
182
                 var convertResult = ConvertMethodCallExpression(methodCallExpression, null, typeTo);
182
                 if (!convertResult)
183
                 if (!convertResult)
261
             var convertedParams = new List<ParameterExpression>();
262
             var convertedParams = new List<ParameterExpression>();
262
             foreach (var parameter in node.Parameters)
263
             foreach (var parameter in node.Parameters)
263
             {
264
             {
264
-                // TODO check Options.Types[parameter.Type] access
265
-                var convertedParam = Expression.Parameter(Options.Types[parameter.Type]);
265
+                var convertedParam = Expression.Parameter(Options.TypeConverter.ConvertType(parameter.Type));
266
                 Options.Parameters.Add(parameter, convertedParam);
266
                 Options.Parameters.Add(parameter, convertedParam);
267
                 convertedParams.Add(convertedParam);
267
                 convertedParams.Add(convertedParam);
268
             }
268
             }

+ 3
- 2
Luticate2.Auth/Utils/Business/ExpressionConverter/LuExpressionParamReplaceVisitor.cs 파일 보기

1
 using System.Linq.Expressions;
1
 using System.Linq.Expressions;
2
+using Luticate2.Auth.Utils.Business.Converters;
2
 using Luticate2.Auth.Utils.Dbo;
3
 using Luticate2.Auth.Utils.Dbo;
3
 using Luticate2.Auth.Utils.Dbo.Result;
4
 using Luticate2.Auth.Utils.Dbo.Result;
4
 using Luticate2.Auth.Utils.Exceptions;
5
 using Luticate2.Auth.Utils.Exceptions;
7
 {
8
 {
8
     public class LuExpressionParamReplaceVisitor : ExpressionVisitor
9
     public class LuExpressionParamReplaceVisitor : ExpressionVisitor
9
     {
10
     {
10
-        public LuExpressionConverterOptions Options { get; }
11
+        public LuConvertersOptions Options { get; }
11
 
12
 
12
-        public LuExpressionParamReplaceVisitor(LuExpressionConverterOptions options)
13
+        public LuExpressionParamReplaceVisitor(LuConvertersOptions options)
13
         {
14
         {
14
             Options = options;
15
             Options = options;
15
         }
16
         }

Luticate2.Auth/Utils/Business/ExpressionConverter/LuObjectConverterIdentity.cs → Luticate2.Auth/Utils/Business/ObjectConverter/LuObjectConverterIdentity.cs 파일 보기

1
+using Luticate2.Auth.Utils.Business.Converters;
1
 using Luticate2.Auth.Utils.Dbo.Fields;
2
 using Luticate2.Auth.Utils.Dbo.Fields;
2
 using Luticate2.Auth.Utils.Dbo.Result;
3
 using Luticate2.Auth.Utils.Dbo.Result;
3
 using Luticate2.Auth.Utils.Interfaces;
4
 using Luticate2.Auth.Utils.Interfaces;
4
 
5
 
5
-namespace Luticate2.Auth.Utils.Business.ExpressionConverter
6
+namespace Luticate2.Auth.Utils.Business.ObjectConverter
6
 {
7
 {
7
     public class LuObjectConverterIdentity : ILuObjectConverterIdentity
8
     public class LuObjectConverterIdentity : ILuObjectConverterIdentity
8
     {
9
     {
9
-        public LuResult<object> Convert(object srcObj, LuPartialFieldsDbo fields, LuExpressionConverterOptions options)
10
+        public LuResult<object> Convert(object srcObj, LuPartialFieldsDbo fields, LuConvertersOptions options)
10
         {
11
         {
11
             return LuResult<object>.Ok(srcObj);
12
             return LuResult<object>.Ok(srcObj);
12
         }
13
         }

+ 86
- 0
Luticate2.Auth/Utils/Business/ObjectConverter/LuObjectConverterLists.cs 파일 보기

1
+using System;
2
+using System.Collections;
3
+using System.Collections.Generic;
4
+using System.Collections.ObjectModel;
5
+using Luticate2.Auth.Utils.Business.Converters;
6
+using Luticate2.Auth.Utils.Dbo;
7
+using Luticate2.Auth.Utils.Dbo.Fields;
8
+using Luticate2.Auth.Utils.Dbo.Result;
9
+using Luticate2.Auth.Utils.Interfaces;
10
+
11
+namespace Luticate2.Auth.Utils.Business.ObjectConverter
12
+{
13
+    public abstract class LuObjectConverterLists : ILuObjectConverter
14
+    {
15
+        protected IServiceProvider ServiceProvider { get; }
16
+
17
+        public LuObjectConverterLists(IServiceProvider serviceProvider)
18
+        {
19
+            ServiceProvider = serviceProvider;
20
+        }
21
+
22
+        protected abstract Type GetListType();
23
+
24
+        public LuResult<object> Convert(object srcObj, LuPartialFieldsDbo fields, LuConvertersOptions options)
25
+        {
26
+            if (srcObj is IEnumerable enumerable)
27
+            {
28
+                var listType = GetListType();
29
+                var listTypeTo = options.TypeConverter.ConvertType(srcObj.GetType().GetGenericArguments()[0]);
30
+                var glistType = listType.MakeGenericType(listTypeTo);
31
+                var collection = options.Allocator.GetInstance(glistType);
32
+                foreach (var obj in enumerable)
33
+                {
34
+                    object convertedObj = null;
35
+                    if (obj != null)
36
+                    {
37
+                        var typeFrom = obj.GetType();
38
+                        var typeTo = options.TypeConverter.ConvertType(typeFrom);
39
+                        // TODO Handle converter == null
40
+                        var converter = LuObjectConverterUtils.GetObjectConverter(ServiceProvider, typeFrom, typeTo);
41
+                        var convertResult = converter.Convert(obj, fields, options);
42
+                        if (!convertResult)
43
+                        {
44
+                            return convertResult;
45
+                        }
46
+
47
+                        convertedObj = convertResult.Data;
48
+                    }
49
+
50
+                    var methodInfo = collection.GetType().GetMethod(nameof(ICollection<object>.Add));
51
+                    methodInfo.Invoke(collection, new []{convertedObj});
52
+                }
53
+
54
+                return LuResult<object>.Ok(collection);
55
+            }
56
+            else
57
+            {
58
+                return LuResult<object>.Error(LuStatus.InputError.ToInt(), $"Could not convert {nameof(srcObj)} to {nameof(IEnumerable)}");
59
+            }
60
+        }
61
+    }
62
+
63
+    public class LuObjectConverterList : LuObjectConverterLists
64
+    {
65
+        public LuObjectConverterList(IServiceProvider serviceProvider) : base(serviceProvider)
66
+        {
67
+        }
68
+
69
+        protected override Type GetListType()
70
+        {
71
+            return typeof(List<>);
72
+        }
73
+    }
74
+
75
+    public class LuObjectConverterCollection : LuObjectConverterLists
76
+    {
77
+        public LuObjectConverterCollection(IServiceProvider serviceProvider) : base(serviceProvider)
78
+        {
79
+        }
80
+
81
+        protected override Type GetListType()
82
+        {
83
+            return typeof(Collection<>);
84
+        }
85
+    }
86
+}

+ 19
- 22
Luticate2.Auth/Utils/Business/ObjectConverter/LuObjectConverterPoco.cs 파일 보기

1
 using System;
1
 using System;
2
-using Luticate2.Auth.Utils.Business.ExpressionConverter;
2
+using Luticate2.Auth.Utils.Business.Converters;
3
 using Luticate2.Auth.Utils.Business.Utils;
3
 using Luticate2.Auth.Utils.Business.Utils;
4
 using Luticate2.Auth.Utils.Dbo.Fields;
4
 using Luticate2.Auth.Utils.Dbo.Fields;
5
 using Luticate2.Auth.Utils.Dbo.Result;
5
 using Luticate2.Auth.Utils.Dbo.Result;
17
             ServiceProvider = serviceProvider;
17
             ServiceProvider = serviceProvider;
18
         }
18
         }
19
 
19
 
20
-        protected ILuObjectConverter GetObjectConverter(Type typeFrom, Type typeTo)
21
-        {
22
-            var type = typeof(ILuObjectConverter<,>);
23
-            var gtype = type.MakeGenericType(typeFrom, typeTo);
24
-            var converter = (ILuObjectConverter) ServiceProvider.GetService(gtype);
25
-            if (converter == null && typeFrom == typeTo)
26
-            {
27
-                converter = (ILuObjectConverter) ServiceProvider.GetService(typeof(ILuObjectConverterIdentity));
28
-            }
29
-            return converter;
30
-        }
31
-
32
-        public LuResult<object> Convert(object srcObj, LuPartialFieldsDbo fields, LuExpressionConverterOptions options)
20
+        public LuResult<object> Convert(object srcObj, LuPartialFieldsDbo fields, LuConvertersOptions options)
33
         {
21
         {
34
             // TODO Check if this is correct
22
             // TODO Check if this is correct
35
             if (srcObj == null)
23
             if (srcObj == null)
39
             // TODO Handle descriptor == null
27
             // TODO Handle descriptor == null
40
             var descriptor = ServiceProvider.GetService<ILuObjectConverterDescriptor<TTypeTo, TTypeFrom>>();
28
             var descriptor = ServiceProvider.GetService<ILuObjectConverterDescriptor<TTypeTo, TTypeFrom>>();
41
             var typeTo = typeof(TTypeTo);
29
             var typeTo = typeof(TTypeTo);
42
-            var dstObj = options.Allocator(typeTo);
30
+            var dstObj = options.Allocator.GetInstance(typeTo);
43
 
31
 
44
             foreach (var memberInfo in typeTo.GetProperties())
32
             foreach (var memberInfo in typeTo.GetProperties())
45
             {
33
             {
46
                 // TODO check if field is included in fields
34
                 // TODO check if field is included in fields
47
-                // TODO Handle valueExpression == null
35
+                // TODO Handle srcPropExpression == null
48
                 var srcPropExpression = descriptor.GetMemberValueExpression(memberInfo, options);
36
                 var srcPropExpression = descriptor.GetMemberValueExpression(memberInfo, options);
49
                 var srcPropDelegate = srcPropExpression.Compile();
37
                 var srcPropDelegate = srcPropExpression.Compile();
50
                 var srcProp = srcPropDelegate.DynamicInvoke(srcObj);
38
                 var srcProp = srcPropDelegate.DynamicInvoke(srcObj);
51
-
52
-                var objectConverter = GetObjectConverter(srcProp.GetType(), memberInfo.GetUnderlyingType());
53
-                var dstProp = objectConverter.Convert(srcProp, fields, options);
54
-                if (!dstProp)
39
+                object dstProp = null;
40
+                if (srcProp != null)
55
                 {
41
                 {
56
-                    return dstProp;
42
+                    var srcType = srcProp.GetType();
43
+
44
+                    // TODO Handle objectConverter == null
45
+                    var objectConverter = LuObjectConverterUtils.GetObjectConverter(ServiceProvider, srcType, memberInfo.GetUnderlyingType());
46
+                    var dstPropResult = objectConverter.Convert(srcProp, fields, options);
47
+                    if (!dstPropResult)
48
+                    {
49
+                        return dstPropResult;
50
+                    }
51
+
52
+                    dstProp = dstPropResult.Data;
57
                 }
53
                 }
58
-                var result = LuExpressionUtils.SetValueFromMember(memberInfo, dstObj, dstProp.Data);
54
+
55
+                var result = LuExpressionUtils.SetValueFromMember(memberInfo, dstObj, dstProp);
59
                 if (!result)
56
                 if (!result)
60
                 {
57
                 {
61
                     return result.To<object>();
58
                     return result.To<object>();

+ 38
- 0
Luticate2.Auth/Utils/Business/ObjectConverter/LuObjectConverterUtils.cs 파일 보기

1
+using System;
2
+using Luticate2.Auth.Utils.Interfaces;
3
+
4
+namespace Luticate2.Auth.Utils.Business.ObjectConverter
5
+{
6
+    public static class LuObjectConverterUtils
7
+    {
8
+        public static ILuObjectConverter GetObjectConverter(IServiceProvider serviceProvider, Type typeFrom, Type typeTo)
9
+        {
10
+            var type = typeof(ILuObjectConverter<,>);
11
+            var gtype = type.MakeGenericType(typeFrom, typeTo);
12
+            var converter = (ILuObjectConverter) serviceProvider.GetService(gtype);
13
+
14
+            if (converter == null)
15
+            {
16
+                var baseTypeFrom = typeFrom;
17
+                if (typeFrom.IsGenericType)
18
+                {
19
+                    baseTypeFrom = typeFrom.GetGenericTypeDefinition();
20
+                }
21
+                var baseTypeTo = typeTo;
22
+                if (typeTo.IsGenericType)
23
+                {
24
+                    baseTypeTo = typeTo.GetGenericTypeDefinition();
25
+                }
26
+                gtype = type.MakeGenericType(baseTypeFrom, baseTypeTo);
27
+                converter = (ILuObjectConverter) serviceProvider.GetService(gtype);
28
+            }
29
+
30
+            if (converter == null && typeFrom == typeTo)
31
+            {
32
+                converter = (ILuObjectConverter) serviceProvider.GetService(typeof(ILuObjectConverterIdentity));
33
+            }
34
+
35
+            return converter;
36
+        }
37
+    }
38
+}

+ 12
- 20
Luticate2.Auth/Utils/Business/ObjectConverterDescriptor/LuObjectConverterDescriptor.cs 파일 보기

3
 using System.Linq;
3
 using System.Linq;
4
 using System.Linq.Expressions;
4
 using System.Linq.Expressions;
5
 using System.Reflection;
5
 using System.Reflection;
6
+using Luticate2.Auth.Utils.Business.Converters;
6
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
7
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
7
 using Luticate2.Auth.Utils.Business.Utils;
8
 using Luticate2.Auth.Utils.Business.Utils;
8
 using Luticate2.Auth.Utils.Interfaces;
9
 using Luticate2.Auth.Utils.Interfaces;
11
 {
12
 {
12
     public class LuObjectConverterDescriptor : ILuObjectConverterDescriptor
13
     public class LuObjectConverterDescriptor : ILuObjectConverterDescriptor
13
     {
14
     {
14
-        protected enum PropertyType
15
-        {
16
-            Value,
17
-            Object
18
-        }
19
-
20
         protected class LuObjectConverterDescriptorMemberInfo
15
         protected class LuObjectConverterDescriptorMemberInfo
21
         {
16
         {
22
             public LambdaExpression ValueExpression { get; set; }
17
             public LambdaExpression ValueExpression { get; set; }
23
-
24
-            public PropertyType PropertyType { get; set; }
25
         }
18
         }
26
 
19
 
27
         protected class LuObjectConverterDescriptorMethodInfo
20
         protected class LuObjectConverterDescriptorMethodInfo
29
             public LambdaExpression ValueExpression { get; set; }
22
             public LambdaExpression ValueExpression { get; set; }
30
         }
23
         }
31
 
24
 
32
-        protected delegate LuObjectConverterDescriptorMethodInfo DynamicMethodConverter(MethodInfo methodInfo, IDictionary<Type, Type> types);
25
+        protected delegate LuObjectConverterDescriptorMethodInfo DynamicMethodConverter(MethodInfo methodInfo, ILuConvertersTypeConverter typeConverter);
33
 
26
 
34
         private IDictionary<MemberInfo, LuObjectConverterDescriptorMemberInfo> StaticMemberConverters { get; } = new Dictionary<MemberInfo, LuObjectConverterDescriptorMemberInfo>();
27
         private IDictionary<MemberInfo, LuObjectConverterDescriptorMemberInfo> StaticMemberConverters { get; } = new Dictionary<MemberInfo, LuObjectConverterDescriptorMemberInfo>();
35
 
28
 
37
 
30
 
38
         private IDictionary<MethodInfo, DynamicMethodConverter> DynamicMethodConverters { get; } = new Dictionary<MethodInfo, DynamicMethodConverter>();
31
         private IDictionary<MethodInfo, DynamicMethodConverter> DynamicMethodConverters { get; } = new Dictionary<MethodInfo, DynamicMethodConverter>();
39
 
32
 
40
-        protected void AddMemberConverter(LambdaExpression memberFrom, LambdaExpression valueExpression, PropertyType propertyType)
33
+        protected void AddMemberConverter(LambdaExpression memberFrom, LambdaExpression valueExpression)
41
         {
34
         {
42
             // TODO: check memberInfo != null
35
             // TODO: check memberInfo != null
43
             var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression(memberFrom);
36
             var memberInfo = LuExpressionUtils.GetSingleMemberFromExpression(memberFrom);
44
             StaticMemberConverters.Add(memberInfo, new LuObjectConverterDescriptorMemberInfo
37
             StaticMemberConverters.Add(memberInfo, new LuObjectConverterDescriptorMemberInfo
45
             {
38
             {
46
-                ValueExpression = LuExpressionUtils.GetFromConvert(valueExpression),
47
-                PropertyType = propertyType
39
+                ValueExpression = LuExpressionUtils.GetFromConvert(valueExpression)
48
             });
40
             });
49
         }
41
         }
50
 
42
 
69
         protected void AddDynamicMethodConverterTemplate(LambdaExpression methodFrom)
61
         protected void AddDynamicMethodConverterTemplate(LambdaExpression methodFrom)
70
         {
62
         {
71
             AddDynamicMethodConverter(methodFrom,
63
             AddDynamicMethodConverter(methodFrom,
72
-                (info, types) =>
64
+                (info, converter) =>
73
                 {
65
                 {
74
                     var genericMethodInfo = info.GetGenericMethodDefinition();
66
                     var genericMethodInfo = info.GetGenericMethodDefinition();
75
-                    var templateMethodInfo = genericMethodInfo.MakeGenericMethod(info.GetGenericArguments().Select(x => types[x]).ToArray());
67
+                    var templateMethodInfo = genericMethodInfo.MakeGenericMethod(info.GetGenericArguments().Select(converter.ConvertType).ToArray());
76
 
68
 
77
                     var lambdaParams = new List<ParameterExpression>
69
                     var lambdaParams = new List<ParameterExpression>
78
                     {
70
                     {
92
             );
84
             );
93
         }
85
         }
94
 
86
 
95
-        public LambdaExpression GetMemberValueExpression(MemberInfo memberInfo, LuExpressionConverterOptions options)
87
+        public LambdaExpression GetMemberValueExpression(MemberInfo memberInfo, LuConvertersOptions options)
96
         {
88
         {
97
             if (StaticMemberConverters.ContainsKey(memberInfo))
89
             if (StaticMemberConverters.ContainsKey(memberInfo))
98
             {
90
             {
102
             return null;
94
             return null;
103
         }
95
         }
104
 
96
 
105
-        public LambdaExpression GetMethodValueExpression(MethodInfo methodInfo, LuExpressionConverterOptions options)
97
+        public LambdaExpression GetMethodValueExpression(MethodInfo methodInfo, LuConvertersOptions options)
106
         {
98
         {
107
             if (StaticMethodConverters.ContainsKey(methodInfo))
99
             if (StaticMethodConverters.ContainsKey(methodInfo))
108
             {
100
             {
112
             var genericMethodInfo = methodInfo.GetGenericMethodDefinition();
104
             var genericMethodInfo = methodInfo.GetGenericMethodDefinition();
113
             if (DynamicMethodConverters.ContainsKey(genericMethodInfo))
105
             if (DynamicMethodConverters.ContainsKey(genericMethodInfo))
114
             {
106
             {
115
-                var result = DynamicMethodConverters[genericMethodInfo](methodInfo, options.Types);
107
+                var result = DynamicMethodConverters[genericMethodInfo](methodInfo, options.TypeConverter);
116
                 if (result != null)
108
                 if (result != null)
117
                 {
109
                 {
118
                     return result.ValueExpression;
110
                     return result.ValueExpression;
126
     public class LuObjectConverterDescriptor<TTypeFrom, TTypeTo> : LuObjectConverterDescriptor, ILuObjectConverterDescriptor<TTypeFrom, TTypeTo>
118
     public class LuObjectConverterDescriptor<TTypeFrom, TTypeTo> : LuObjectConverterDescriptor, ILuObjectConverterDescriptor<TTypeFrom, TTypeTo>
127
     {
119
     {
128
         protected void AddMemberConverter(Expression<Func<TTypeFrom, object>> memberFrom,
120
         protected void AddMemberConverter(Expression<Func<TTypeFrom, object>> memberFrom,
129
-            Expression<Func<TTypeTo, object>> valueExpression, PropertyType propertyType)
121
+            Expression<Func<TTypeTo, object>> valueExpression)
130
         {
122
         {
131
-            AddMemberConverter((LambdaExpression) memberFrom, valueExpression, propertyType);
123
+            AddMemberConverter((LambdaExpression) memberFrom, valueExpression);
132
         }
124
         }
133
 
125
 
134
         protected void AddNullMemberConverter(Expression<Func<TTypeFrom, object>> memberFrom)
126
         protected void AddNullMemberConverter(Expression<Func<TTypeFrom, object>> memberFrom)
135
         {
127
         {
136
-            AddMemberConverter(memberFrom, to => default(TTypeTo), PropertyType.Value);
128
+            AddMemberConverter(memberFrom, to => null);
137
         }
129
         }
138
     }
130
     }
139
 }
131
 }

+ 3
- 2
Luticate2.Auth/Utils/Business/ObjectConverterDescriptor/LuObjectConverterDescriptorIdentity.cs 파일 보기

2
 using System.Linq;
2
 using System.Linq;
3
 using System.Linq.Expressions;
3
 using System.Linq.Expressions;
4
 using System.Reflection;
4
 using System.Reflection;
5
+using Luticate2.Auth.Utils.Business.Converters;
5
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
6
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
6
 using Luticate2.Auth.Utils.Interfaces;
7
 using Luticate2.Auth.Utils.Interfaces;
7
 
8
 
9
 {
10
 {
10
     public class LuObjectConverterDescriptorIdentity : ILuObjectConverterDescriptorIdentity
11
     public class LuObjectConverterDescriptorIdentity : ILuObjectConverterDescriptorIdentity
11
     {
12
     {
12
-        public LambdaExpression GetMemberValueExpression(MemberInfo memberInfo, LuExpressionConverterOptions options)
13
+        public LambdaExpression GetMemberValueExpression(MemberInfo memberInfo, LuConvertersOptions options)
13
         {
14
         {
14
             var isStatic = false;
15
             var isStatic = false;
15
             if (memberInfo is FieldInfo fieldInfo)
16
             if (memberInfo is FieldInfo fieldInfo)
26
             return lambda;
27
             return lambda;
27
         }
28
         }
28
 
29
 
29
-        public LambdaExpression GetMethodValueExpression(MethodInfo methodInfo, LuExpressionConverterOptions options)
30
+        public LambdaExpression GetMethodValueExpression(MethodInfo methodInfo, LuConvertersOptions options)
30
         {
31
         {
31
             var lambdaParams = new List<ParameterExpression>
32
             var lambdaParams = new List<ParameterExpression>
32
             {
33
             {

+ 9
- 0
Luticate2.Auth/Utils/Interfaces/ILuConvertersAllocator.cs 파일 보기

1
+using System;
2
+
3
+namespace Luticate2.Auth.Utils.Interfaces
4
+{
5
+    public interface ILuConvertersAllocator
6
+    {
7
+        object GetInstance(Type type);
8
+    }
9
+}

+ 9
- 0
Luticate2.Auth/Utils/Interfaces/ILuConvertersTypeConverter.cs 파일 보기

1
+using System;
2
+
3
+namespace Luticate2.Auth.Utils.Interfaces
4
+{
5
+    public interface ILuConvertersTypeConverter
6
+    {
7
+        Type ConvertType(Type typeFrom);
8
+    }
9
+}

+ 2
- 1
Luticate2.Auth/Utils/Interfaces/ILuObjectConverter.cs 파일 보기

1
+using Luticate2.Auth.Utils.Business.Converters;
1
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
2
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
2
 using Luticate2.Auth.Utils.Dbo.Fields;
3
 using Luticate2.Auth.Utils.Dbo.Fields;
3
 using Luticate2.Auth.Utils.Dbo.Result;
4
 using Luticate2.Auth.Utils.Dbo.Result;
6
 {
7
 {
7
     public interface ILuObjectConverter
8
     public interface ILuObjectConverter
8
     {
9
     {
9
-        LuResult<object> Convert(object srcObj, LuPartialFieldsDbo fields, LuExpressionConverterOptions options);
10
+        LuResult<object> Convert(object srcObj, LuPartialFieldsDbo fields, LuConvertersOptions options);
10
     }
11
     }
11
 
12
 
12
     public interface ILuObjectConverter<TTypeFrom, TTypeTo> : ILuObjectConverter
13
     public interface ILuObjectConverter<TTypeFrom, TTypeTo> : ILuObjectConverter

+ 3
- 2
Luticate2.Auth/Utils/Interfaces/ILuObjectConverterDescriptor.cs 파일 보기

1
 using System.Linq.Expressions;
1
 using System.Linq.Expressions;
2
 using System.Reflection;
2
 using System.Reflection;
3
+using Luticate2.Auth.Utils.Business.Converters;
3
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
4
 using Luticate2.Auth.Utils.Business.ExpressionConverter;
4
 
5
 
5
 namespace Luticate2.Auth.Utils.Interfaces
6
 namespace Luticate2.Auth.Utils.Interfaces
6
 {
7
 {
7
     public interface ILuObjectConverterDescriptor
8
     public interface ILuObjectConverterDescriptor
8
     {
9
     {
9
-        LambdaExpression GetMemberValueExpression(MemberInfo memberInfo, LuExpressionConverterOptions options);
10
+        LambdaExpression GetMemberValueExpression(MemberInfo memberInfo, LuConvertersOptions options);
10
 
11
 
11
-        LambdaExpression GetMethodValueExpression(MethodInfo methodInfo, LuExpressionConverterOptions options);
12
+        LambdaExpression GetMethodValueExpression(MethodInfo methodInfo, LuConvertersOptions options);
12
     }
13
     }
13
 
14
 
14
     public interface ILuObjectConverterDescriptor<TTypeFrom, TTypeTo> : ILuObjectConverterDescriptor
15
     public interface ILuObjectConverterDescriptor<TTypeFrom, TTypeTo> : ILuObjectConverterDescriptor

Loading…
취소
저장