.Net Core AutoMapper自定義擴展方法的使用

上次我們講了如何在.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,從而來實現映射處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章