国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

AutoMapper(四)

2019-11-14 13:48:05
字體:
來源:轉載
供稿:網友

返回總目錄


自定義值解析

雖然AutoMapper覆蓋了相當一部分目標成員的映射場景,但是還有 1-5%的目標值需要解析處理一下。很多時候,自定義的值解析是可以放在領域層的領域邏輯。然而,如果該邏輯只是和映射操作有關的話,那它就會應為一些不必要的行為使得源類型很凌亂。這種場合,AutoMapper允許我們為目標成員配置自定義的值解析器。

舉個栗子,有兩個類Source和Destination,定義如下:

public class Source{    public int Value1 { get; set; }    public int Value2 { get; set; }}
public class Destination{    public int Total { get; set; } }

我們想要在映射期間產生一個計算的值,也就是說,在Source到Destination映射的過程中,把Source的兩個屬性值加起來賦給Destination的屬性。由于某些原因,我們不能把這個邏輯放到源類型里,為了提供一個自定義值解析器,我們首先需要創建一個實現了IValueResolver:

public class MyValueResolver : IValueResolver{    public ResolutionResult Resolve(ResolutionResult source)    {        //TODO:實現邏輯    }}

ResolutionContext包含了當前解析操作的所有上下文信息,如源類型,源值等等。大多數場合,我們不需要這個更高級的接口。另一種方法,我們可以實現抽象類ValueResolver<TSource, TDestination>:

public class MyValueResolver : ValueResolver<Source, int>{    PRotected override int ResolveCore(Source source)    {        return source.Value1 + source.Value2;    }}

現在,我們已經實現了自己的值解析器,接下來就需要告訴AutoMapper,當解析一個特定的目標成員時,要使用這個自定義的值解析器。有3中方式告訴AutoMapper如何使用自定義解析器,包括:

  • ResolveUsing<TValueResolver>
  • ResolveUsing(typeof(CustomValueResolver))
  • ResolveUsing(aValueResolverInstance)

接下來,我們就開始使用自己的值解析器:

class Program{    static void Main(string[] args)    {        Mapper.CreateMap<Source, Destination>().ForMember(dest => dest.Total, opt =>        {            opt.ResolveUsing<MyValueResolver>();        });        var src = new Source {Value1 = 3, Value2 = 5};        var destObj= Mapper.Map<Destination>(src);        Console.WriteLine("destObj.Total={0}", destObj.Total);        Console.Read();    }}

雖然目標成員Total沒有任何匹配的源成員,但是我們給它添加了有效配置的自定義解析器,解析器就會對目標成員值的提供負責。

測試成功,結果如下:

image

自定義構造函數方法

因為我們只提供了自定義的解析器類型給AutoMapper,所以映射引擎會使用反射創建該值解析器的實例。如果我們不想要AutoMapper使用反射創建實例,我們要么直接提供一個實例,要么使用ConstruceBy方法來提供一個自定義的構造函數方法:

Mapper.CreateMap<Source, Destination>().ForMember(dest => dest.Total, opt =>{    opt.ResolveUsing<MyValueResolver>().ConstructedBy(()=>new MyValueResolver());});

在映射操作期間,AutoMapper不使用反射,直接執行此回調函數。這在解析器可能需要構造函數參數或者需要通過Ioc容器構建的時候很有用。

這里不再做演示,有興趣的小伙伴可自行研究。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 礼泉县| 乐亭县| 镇赉县| 伊宁县| 赫章县| 焉耆| 运城市| 环江| 凤山市| 静安区| 苍梧县| 临漳县| 临清市| 定南县| 昭通市| 舟曲县| 伊宁市| 永宁县| 栾城县| 阳春市| 尚义县| 左贡县| 滕州市| 临潭县| 方正县| 高台县| 莒南县| 舟曲县| 保康县| 新沂市| 罗源县| 荔浦县| 平阴县| 鹰潭市| 武宁县| 侯马市| 铜梁县| 澎湖县| 旅游| 安龙县| 成武县|