如何在 .NET Core 中使用 AutoMapper 編寫自定義解析器
本文將介紹如果利用.NET Core的依賴注入技術(shù)使用AutoMapper的自動逸解析器。

AutoMapper 是 .NET 生態(tài)系統(tǒng)中的一個出色工具,它簡化了將屬性值從一個對象“ClassOne”“映射”到另一個對象(可能是“ClassTwo”)的屬性的過程。對于大多數(shù)用例,映射值可以很容易地從源對象確定,并且通常映射到目標對象上的一個字段,即使與該字段的名稱不同,或者需要忽略的屬性值。
前幾天,我遇到了一個edge案例,需要在特定映射中使用應(yīng)用程序配置中的URL值。如何訪問我在應(yīng)用程序啟動時注冊為依賴項的配置并不明顯。幸運的是,我在AutoMapper偶然發(fā)現(xiàn)了IValueResolver,我想和大家分享以下我是怎么處理的,這樣,如果你遇到這種情況,就可以節(jié)約你的時間了。
自定義解析器
如上所述,我需要在程序啟動期間注冊為可注入依賴項的配置中的一個值。我需要創(chuàng)建一個自定義解析器來解決這個問題,它實現(xiàn)了一個名為 `IValueResolver` 的 AutoMapper的 接口。此接口要求您實現(xiàn)一個名為 Resolve的方法,該方法提供對源對象和目標對象的訪問,并將目標值設(shè)置為函數(shù)的輸出。
在這個解析器中,我們可以聲明一個構(gòu)造函數(shù),它允許我們注入我們在啟動時注冊的配置對象。如果沒有這個解析器,我們就無法在常規(guī)的 MappingProfile 中注入該配置,也不會給我們的頂級映射類引入一些非常緊密的耦合。使用這種方法,我們只在特定映射中需要它們時才注入依賴項。
using AutoMapper;
using Microsoft.Extensions.Configuration
public class MyResolver : IValueResolver
{
private readonly string _myAppUrl
public MyResolver(IConfiguration configuration)
{
_myAppUrl = configuration["MyAppUrl"];
}
public string Resolve(SourceType source, TargetType target, string destMember, ResolutionContext context)
{
return $"{_myAppUrl}/api/Orders/{source.OrderId}";
}
}
使用自定義解析器
我們在下面的代碼中添加屬性映射,并告訴 AutoMapper 在映射值時使用自定義解析器。
using AutoMapper;
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap()
.ForMember(x => x.Url, opt => opt.MapFrom());
}
}
// In Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// May not need this if mappings are in same project
services.AddTransient();
}
總結(jié)
我希望你喜歡這篇文章。AutoMapper 和 .NET Core 的 DI 都是很棒的工具,而自定義解析器使我們能夠利用兩者的強大功能。快樂學(xué)習(xí),開心工作!
文章翻譯自:https://enlear.academy/how-to-write-a-custom-resolver-using-automapper-in-net-core-52d90f0a5ba5
