.Net Core AutoMapper自定義擴充套件方法的使用

Sammy愛學習發表於2020-02-04

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

相關文章