zoukankan      html  css  js  c++  java
  • [转载]AutoMapper 9.0的改造

    转载自

    https://www.cnblogs.com/NCoreCoder/p/11359294.html

    AutoMapper于2019.8.12升级9.0

    从此不再支持静态的对象转换

    自己琢磨了一下,写了一套扩展

    官方链接如下

    https://github.com/AutoMapper/AutoMapper/tree/v9.0.0

    我做了一下方便使用的简单封装

    复制代码
        public static class AutoMapperExtension
        {
            public static IServiceCollection AddAutoMapper(this IServiceCollection service)
            {
                service.TryAddSingleton<MapperConfigurationExpression>();
                service.TryAddSingleton(serviceProvider =>
                {
                    var mapperConfigurationExpression = serviceProvider.GetRequiredService<MapperConfigurationExpression>();
                    var instance = new MapperConfiguration(mapperConfigurationExpression);
    
                    instance.AssertConfigurationIsValid();
    
                    return instance;
                });
                service.TryAddSingleton(serviceProvider =>
                {
                    var mapperConfiguration = serviceProvider.GetRequiredService<MapperConfiguration>();
    
                    return mapperConfiguration.CreateMapper();
                });
    
                return service;
            }
    
            public static IMapperConfigurationExpression UseAutoMapper(this IApplicationBuilder applicationBuilder)
            {
                return applicationBuilder.ApplicationServices.GetRequiredService<MapperConfigurationExpression>();
            }
        }
    复制代码

    调用则是在ConfigureServices方法内增加一行

    services.AddAutoMapper();

    在Configure方法内增加如下代码

                var expression = app.UseAutoMapper();
                expression.CreateMap<Foo, FoodDto>();

    这样就完成了DI版本的AutoMapper

    调用例子代码如下

    复制代码
        public class ValuesController : ControllerBase
        {
            private IMapper Mapper { get; }
    
            public ValuesController(IMapper mapper)
            {
                Mapper = mapper;
            }
    
            // GET api/values
            [HttpGet]
            public FoodDto Get()
            {
                var model = new Foo()
                {
                    Id = Guid.NewGuid(),
                    Name = "test",
                    Money = 15.0m
                };
    
                return Mapper.Map<FoodDto>(model);
            }
        }
    复制代码

    测试结果如下

    但是仅仅是这样不够的,方便使用的话,还需要一个静态Helper

    代码如下

    复制代码
        public static class AutoMapperHelper
        {
            private static IServiceProvider ServiceProvider;
    
            public static void UseStateAutoMapper(this IApplicationBuilder applicationBuilder)
            {
                ServiceProvider = applicationBuilder.ApplicationServices;
            }
    
            public static TDestination Map<TDestination>(object source)
            {
                var mapper = ServiceProvider.GetRequiredService<IMapper>();
    
                return mapper.Map<TDestination>(source);
            }
    
            public static TDestination Map<TSource, TDestination>(TSource source)
            {
                var mapper = ServiceProvider.GetRequiredService<IMapper>();
    
                return mapper.Map<TSource, TDestination>(source);
            }
        }
    复制代码

    同理在Configure方法内增加一行代码

    app.UseStateAutoMapper();

    增加一个Action调用一下

    复制代码
            [HttpGet("Static")]
            public FoodDto Static()
            {
                var model = new Foo()
                {
                    Id = Guid.NewGuid(),
                    Name = "test",
                    Money = 15.0m
                };
    
                return AutoMapperHelper.Map<FoodDto>(model);
            }
    复制代码

    调用结果如下

    大功告成,其实这次更新只是一个思路上的转变,便捷性,都只是小事儿而已


    应邀在某个汪姓大佬的要求下,增加两个扩展方法

    复制代码
        public static class AutoMapperHelper
        {
            ...
            public static TDestination MapTo<TSource, TDestination>(this TSource source)
            {
                var mapper = ServiceProvider.GetRequiredService<IMapper>();
    
                return mapper.Map<TSource, TDestination>(source);
            }
    
            public static TDestination MapTo<TDestination>(this object source)
            {
                var mapper = ServiceProvider.GetRequiredService<IMapper>();
    
                return mapper.Map<TDestination>(source);
            }
        }
    复制代码

    测试例子改为

    复制代码
            [HttpGet("Static")]
            public FoodDto Static()
            {
                var model = new Foo()
                {
                    Id = Guid.NewGuid(),
                    Name = "test",
                    Money = 15.0m
                };
    
                return model.MapTo<FoodDto>();
            }
    
            //[HttpGet("Static")]
            //public FoodDto Static()
            //{
            //    var model = new Foo()
            //    {
            //        Id = Guid.NewGuid(),
            //        Name = "test",
            //        Money = 15.0m
            //    };
    
            //    return model.MapTo<Foo, FoodDto>();
            //}
  • 相关阅读:
    【C++】类的特殊成员变量+初始化列表
    SM Java实现
    Android使用OKHttp3实现下载(断点续传、显示运行进度)
    codeforces 486C Palindrome Transformation 贪心求构造回文
    手把手教你画AndroidK线分时图及指标
    怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(3)
    C# 读取Excel中的数据
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Query was empty
    java debug
    8种移动APP导航设计模式对照
  • 原文地址:https://www.cnblogs.com/hx215267863/p/11957728.html
Copyright © 2011-2022 走看看