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>();//}