MapperFactory的实现及应用

基于前述的Mapper类,我们可以定义静态的 Mapper工厂类MapperFactory如下

 public static class MapperFactory
    {
        private static readonly IDictionary<KeyValuePair<Type, Type>, Mapper> Dictionary =
            new ConcurrentDictionary<KeyValuePair<Type, Type>, Mapper>();

        public static bool Contains<TSource, TDest>()
        {
            return Dictionary.ContainsKey(new KeyValuePair<Type, Type>(typeof(TSource), typeof(TDest)));
        }

        public static Mapper<TSource, TDest> CreateOrRetrieveMap<TSource, TDest>() where TDest : class, new()
        {
            var pair = new KeyValuePair<Type, Type>(typeof(TSource), typeof(TDest));

            if (!Dictionary.ContainsKey(pair))
            {
                Dictionary.Add(new KeyValuePair<KeyValuePair<Type, Type>, Mapper>(pair, new Mapper<TSource, TDest>()));
            }

            return Dictionary[pair] as Mapper<TSource, TDest>;
        }

        public static Mapper<TSource, TDest> AddMapperHelper<TSource, TDest>(Mapper<TSource, TDest> mapper) where TDest: class,new()
        {
            if (!Dictionary.ContainsKey(new KeyValuePair<Type, Type>(typeof(TSource), typeof(TDest))))
            {
                Dictionary.Add(new KeyValuePair<KeyValuePair<Type, Type>, Mapper>(
                    new KeyValuePair<Type, Type>(typeof(TSource), typeof(TDest)), mapper));
            }

            return mapper;
        }

        public static Mapper<TSource, TDest> AddMap<TSource, TDest>(Action<TSource, TDest> action) where TDest : class, new()
        {
            var pair = new KeyValuePair<Type, Type>(typeof(TSource), typeof(TDest));

            if (!Dictionary.ContainsKey(pair))
            {
                Dictionary.Add(new KeyValuePair<KeyValuePair<Type, Type>, Mapper>(pair, new Mapper<TSource, TDest>()));
            }

            var mapper = Dictionary[pair] as Mapper<TSource, TDest>;
            mapper.Add(action);

            return mapper;
        }

        public static TDest MapTo<TSource, TDest>(this TSource src) where TDest: class ,new()
        {
            var mapper = RetrieveOrRegisterMapHelper<TSource, TDest>();

            return mapper.Convert(src);
        }

        public static IList<TDest> MapTo<TSource, TDest>(this IEnumerable<TSource> src) where TDest : class, new()
        {
            var mapper = RetrieveOrRegisterMapHelper<TSource, TDest>();

            return mapper.Convert(src);
        }

        private static Mapper<TSource, TDest> RetrieveOrRegisterMapHelper<TSource, TDest>() where TDest : class, new()
        {
            var pair = new KeyValuePair<Type, Type>(typeof(TSource), typeof(TDest));

            if (!Dictionary.ContainsKey(pair))
            {
                var srcRegMethod = typeof(TSource).GetMethod("RegisterMap");
                if (srcRegMethod != null && srcRegMethod.IsStatic)
                {
                    srcRegMethod.Invoke(null, null);
                }

                var destRegMethod = typeof(TDest).GetMethod("RegisterMap");
                if (destRegMethod != null && destRegMethod.IsStatic)
                {
                    destRegMethod.Invoke(null, null);
                }

                if (srcRegMethod == null && destRegMethod == null)
                {
                    AddMapperHelper(new Mapper<TSource, TDest>());
                }
            }
            
            return Dictionary[pair] as Mapper<TSource, TDest>;
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值