上次我們講了如何在.Net Core下使用AutoMapper,我們採用的是AutoMapper 9.0。上次的方法如下
var dto = _mapper.Map<sys_user, sys_userDto>(q);//_mapper.Map<sys_userDto>(q);
這樣也能用,但這樣代碼好像麻煩了點,我們現在可以自己定義一個AutoMapperHelper方法讓調用變得方便一點。
using AutoMapper;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace MyUtility.AutoMapper {
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);
}
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);
}
public static List<TDestination> MapToList<TDestination>(this IEnumerable source) {
var mapper = ServiceProvider.GetRequiredService<IMapper>();
return mapper.Map<List<TDestination>>(source);
}
public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source) {
var mapper = ServiceProvider.GetRequiredService<IMapper>();
return mapper.Map<List<TDestination>>(source);
}
}
}
然後在Startup文件中Configure方法裏註冊下
//AutoMapperHelper擴展方法註冊
app.UseStateAutoMapper();
這樣調用方法就可以改成,直接實現了一個擴展方法
var dto = q.MapTo<sys_userDto>();
相對來說更簡潔點了
注意,這裏重點是要明白IServiceProvider接口,IServiceProvider可以根據IApplicationBuilder來提供,在Startup文件中的Configure方法會注入IApplicationBuilder,那麼我們自定義的AutoMapperHelper擴展方法就可以對IApplicationBuilder擴展來獲得IServiceProvider,
IServiceProvider說明
在ASP.NET Core的容器中,系統提供了IServiceCollection來註冊服務和提供了IServiceProvider這個讓我們解析各種註冊過的服務,提供GetService()和GetRequiredService()兩個方法來解析服務。可以參考下一下文章瞭解下這個知識點
ASP.NET Core中GetService()和GetRequiredService()之間的區別
那麼我們就可以通過IServiceProvider來解析IMapper,從而來實現映射處理。