AutoMapper 9.0的改造
生活随笔
收集整理的這篇文章主要介紹了
AutoMapper 9.0的改造
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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>();//}?
轉載于:https://www.cnblogs.com/NCoreCoder/p/11359294.html
總結
以上是生活随笔為你收集整理的AutoMapper 9.0的改造的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库:如果MySQl磁盘满了,如何解决
- 下一篇: 太极越狱重大安全后门