ExpressionMapper.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using Masuit.Tools.Mapping.Core;
  2. using Masuit.Tools.Mapping.Exceptions;
  3. using System;
  4. using System.Linq.Expressions;
  5. namespace Masuit.Tools.Mapping
  6. {
  7. /// <summary>
  8. /// mapper的基类
  9. /// </summary>
  10. public static class ExpressionMapper
  11. {
  12. private static Func<Type, object> _constructorFunc;
  13. private static bool _initialized;
  14. /// <summary>
  15. /// 映射指定的源。
  16. /// </summary>
  17. /// <typeparam name="TSource">源类型</typeparam>
  18. /// <typeparam name="TDest">目标类型</typeparam>
  19. /// <param name="source">源对象</param>
  20. /// <param name="name">别名</param>
  21. /// <returns>
  22. /// 目标对象的新实例
  23. /// </returns>
  24. public static TDest Map<TSource, TDest>(this TSource source, string name = null) where TSource : class where TDest : class
  25. {
  26. if (source == null)
  27. {
  28. return null;
  29. }
  30. if (!_initialized)
  31. {
  32. Initialize();
  33. }
  34. TDest result = null;
  35. MapperConfiguration<TSource, TDest> mapper = GetMapper<TSource, TDest>(name);
  36. Func<TSource, TDest> query = mapper.GetFuncDelegate();
  37. if (query != null)
  38. {
  39. result = query(source);
  40. // 映射后执行的操作
  41. mapper.ExecuteAfterActions(source, result);
  42. }
  43. return result;
  44. }
  45. /// <summary>
  46. /// 将指定的源映射到目标。
  47. /// </summary>
  48. /// <typeparam name="TSource">源类型</typeparam>
  49. /// <typeparam name="TDest">目标类型</typeparam>
  50. /// <param name="source">源对象</param>
  51. /// <param name="target">目标对象</param>
  52. /// <param name="name">别名</param>
  53. public static void Map<TSource, TDest>(this TSource source, TDest target, string name = null) where TSource : class where TDest : class
  54. {
  55. if (!_initialized)
  56. {
  57. Initialize();
  58. }
  59. TDest result = null;
  60. MapperConfiguration<TSource, TDest> mapper = GetMapper<TSource, TDest>(name);
  61. Action<TSource, TDest> query = mapper.GetDelegateForExistingTarget() as Action<TSource, TDest>;
  62. if (query != null)
  63. {
  64. query(source, target);
  65. // 映射后执行的操作
  66. mapper.ExecuteAfterActions(source, result);
  67. }
  68. }
  69. /// <summary>
  70. /// 获取查询表达式树
  71. /// </summary>
  72. /// <typeparam name="TSource">源类型</typeparam>
  73. /// <typeparam name="TDest">目标类型</typeparam>
  74. /// <returns></returns>
  75. public static Expression<Func<TSource, TDest>> GetQueryExpression<TSource, TDest>() where TSource : class where TDest : class
  76. {
  77. return GetMapper<TSource, TDest>().GetLambdaExpression();
  78. }
  79. /// <summary>
  80. /// 创建mapper对象
  81. /// </summary>
  82. /// <typeparam name="TSource">源类型</typeparam>
  83. /// <typeparam name="TDest">目标类型</typeparam>
  84. /// <returns></returns>
  85. public static MapperConfiguration<TSource, TDest> CreateMap<TSource, TDest>(string name = null) where TSource : class where TDest : class
  86. {
  87. MapperConfigurationBase map = MapperConfigurationCollectionContainer.Instance.Find(typeof(TSource), typeof(TDest), name);
  88. if (map == null)
  89. {
  90. string finalName = string.IsNullOrEmpty(name) ? "s" + MapperConfigurationCollectionContainer.Instance.Count.ToString() : name;
  91. map = new MapperConfiguration<TSource, TDest>(finalName);
  92. MapperConfigurationCollectionContainer.Instance.Add(map);
  93. }
  94. return map as MapperConfiguration<TSource, TDest>;
  95. }
  96. /// <summary>
  97. /// 表示使用的依赖注入服务
  98. /// </summary>
  99. /// <param name="constructor">构造函数委托</param>
  100. public static void ConstructServicesUsing(Func<Type, object> constructor)
  101. {
  102. _constructorFunc = constructor;
  103. }
  104. /// <summary>
  105. /// 重置mapper
  106. /// </summary>
  107. public static void Reset()
  108. {
  109. MapperConfigurationCollectionContainer.Instance.Clear();
  110. }
  111. /// <summary>
  112. /// 获取mapper实例
  113. /// </summary>
  114. /// <typeparam name="TSource">源类型</typeparam>
  115. /// <typeparam name="TDest">目标类型</typeparam>
  116. /// <param name="name">别名</param>
  117. /// <returns></returns>
  118. public static MapperConfiguration<TSource, TDest> GetMapper<TSource, TDest>(string name = null) where TSource : class where TDest : class
  119. {
  120. return GetMapper(typeof(TSource), typeof(TDest), name) as MapperConfiguration<TSource, TDest>;
  121. }
  122. /// <summary>
  123. /// 初始化mapper
  124. /// </summary>
  125. public static void Initialize()
  126. {
  127. MapperConfigurationCollectionContainer configRegister = MapperConfigurationCollectionContainer.Instance;
  128. foreach (var t in configRegister)
  129. {
  130. t.Initialize(_constructorFunc);
  131. }
  132. _initialized = true;
  133. }
  134. /// <summary>
  135. /// 获取mapper的委托
  136. /// </summary>
  137. /// <typeparam name="TSource">源类型</typeparam>
  138. /// <typeparam name="TDest">目标类型</typeparam>
  139. /// <returns></returns>
  140. public static Func<TSource, TDest> GetQuery<TSource, TDest>() where TSource : class where TDest : class
  141. {
  142. return GetMapper<TSource, TDest>().GetFuncDelegate();
  143. }
  144. /// <summary>
  145. /// 获取未映射的属性
  146. /// </summary>
  147. public static PropertiesNotMapped GetPropertiesNotMapped<TSource, TDest>(string name = null) where TSource : class where TDest : class
  148. {
  149. var mapper = GetMapper<TSource, TDest>(name);
  150. return mapper.GetPropertiesNotMapped();
  151. }
  152. internal static MapperConfigurationBase GetMapper(Type tSource, Type tDest, string name = null)
  153. {
  154. MapperConfigurationBase mapConfig = MapperConfigurationCollectionContainer.Instance.Find(tSource, tDest, name);
  155. if (mapConfig == null)
  156. {
  157. throw new NoFoundMapperException(tSource, tDest);
  158. }
  159. return mapConfig;
  160. }
  161. }
  162. }