AutoMapper於2019.8.12升級9.0git
今後再也不支持靜態的對象轉換github
本身琢磨了一下,寫了一套擴展express
官方連接以下api
https://github.com/AutoMapper/AutoMapper/tree/v9.0.0app
我作了一下方便使用的簡單封裝ide
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方法內增長以下代碼ui
var expression = app.UseAutoMapper(); expression.CreateMap<Foo, FoodDto>();
這樣就完成了DI版本的AutoMapperthis
調用例子代碼以下spa
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>(); //}