在.net中使用AutoMapper進行物件對映,物件相互轉,簡單方便

2023-11-24 15:00:47

AutoMapper是一種物件對映工具,它可以幫助我們將不同型別的資料物件之間進行相互轉換。在.NET中,我們可以使用AutoMapper庫來簡化資料物件之間的對映操作,從而提高程式碼的可讀性和可維護性。

一、AutoMapper的安裝和基本使用

  1. 安裝AutoMapper

首先,我們需要在專案中安裝AutoMapper庫。通過NuGet包管理器,我們可以方便地安裝AutoMapper。在Visual Studio中,右鍵點選專案->管理NuGet程式包->瀏覽->搜尋AutoMapper->安裝即可。

  1. 定義資料模型

假設我們有兩個類,一個是Source類,另一個是Destination類。我們希望將Source類的範例對映到Destination類。

public class Source
{
    public int SomeValue { get; set; }
    public string SomeString { get; set; }
}

public class Destination
{
    public int SomeValue { get; set; }
    public string SomeString { get; set; }
}
  1. 設定AutoMapper對映

我們在應用程式的組態檔(例如appsettings.json)中定義AutoMapper的對映設定。在這種情況下,我們定義了Source類和Destination類之間的對映關係。

{
    "AutoMapper": {
        "Maps": {
            "SourceToDestination": {
                "SomeValue": "SomeValue",
                "SomeString": "SomeString"
            }
        }
    }
}
  1. 使用AutoMapper進行對映

現在我們可以在程式碼中使用AutoMapper來將Source物件對映到Destination物件。

IMapper mapper = ConfigurationManager.GetService<IMapper>();
Source source = new Source { SomeValue = 5, SomeString = "Hello" };
Destination destination = mapper.Map<Destination>(source);

二、AutoMapper的高階應用

  1. 巢狀物件的對映

如果我們的Source類和Destination類具有巢狀的物件,我們可以使用AutoMapper來處理這些巢狀物件的對映。假設Source類有一個巢狀的Person類,而Destination類有一個巢狀的PersonDTO類,我們可以這樣定義對映:

{
    "AutoMapper": {
        "Maps": {
            "SourceToDestination": {
                "SomeValue": "SomeValue",
                "SomeString": "SomeString",
                "Person.Name": "PersonDTO.Name",
                "Person.Age": "PersonDTO.Age"
            }
        }
    }
}
  1. 使用MapFrom和Condition進行自定義對映規則

有時候我們可能需要在對映過程中應用一些自定義的對映規則。AutoMapper提供了MapFrom和Condition關鍵字,可以讓我們在對映過程中應用自定義的規則。例如,假設我們在對映Source類到Destination類時,希望將Source類的SomeString屬性轉換為大寫,我們可以這樣定義對映規則:

{
    "AutoMapper": {
        "Maps": {
            "SourceToDestination": {
                "SomeValue": "SomeValue",
                "SomeString": { 
                    "MapFrom": "ConvertToUpper", 
                    "Condition": "it.SomeString != null" 
                }
            }
        }
    },
    "AutoMapperExternals": {
        "Converts": [ { "Type": "System.String", "ConvertUsing": "ConvertToUpper" } ]
    }
}

其中,在程式碼中我們需要定義一個ConvertToUpper方法來將字串轉換為大寫。

public class StringConverter : ITypeConverter<string, string>
{
    public string Convert(ResolutionContext context) => context.SourceValue.ToUpper();
}
  1. 對映繼承屬性

如果你有一個基礎類別或介面,並且你想將該基礎類別或介面的派生類對映到另一個物件,那麼你可以使用AutoMapper的繼承對映功能。你只需要在對映設定中指定基礎類別和派生類之間的對映關係。

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Employee : Person
{
    public string Department { get; set; }
}

// 在對映設定中指定繼承對映關係
cfg.CreateMap<Person, Employee>();
  1. 使用IgnoreMember和IncludeMember

有時候你可能會遇到一些不需要對映的屬性,或者只希望對映物件的一部分屬性。這時,你可以使用IgnoreMember和IncludeMember來控制對映過程。

// 忽略Source物件的某些屬性
cfg.CreateMap<Source, Destination>().ForMember(dest => dest.IgnoredProperty, opt => opt.Ignore());

// 只對映Source物件的某些屬性
cfg.CreateMap<Source, Destination>().ForMember(dest => dest.IncludedProperty, opt => opt.Include("SomeProperty"));
  1. 使用MapFrom和Condition

MapFrom和Condition可以讓你在對映過程中執行更復雜的邏輯。比如,你可以使用MapFrom指定一個方法來確定目標屬性的值,或者使用Condition來控制對映的條件。

// 使用MapFrom指定一個方法來確定目標屬性的值
cfg.CreateMap<Source, Destination>().ForMember(dest => dest.ComputedProperty, opt => opt.MapFrom(src => CalculateValue(src)));

// 使用Condition來控制對映的條件
cfg.CreateMap<Source, Destination>().ForMember(dest => dest.ConditionalProperty, opt => opt.Condition(src => src.SomeProperty != null));
  1. 自定義解析度器

有時候你可能會需要在對映過程中使用自定義的解析度器。你可以實現AutoMapper的IValueResolver介面,並實現自己的解析度邏輯。

public class CustomResolver : IValueResolver<Source, Destination, string>
{
    public string Resolve(Source source, Destination destination, string member, IMappingExpression mapping)
    {
        // 實現自己的解析度邏輯
        return ResolveValue(source);
    }
}

// 在對映設定中使用自定義解析度器
cfg.CreateMap<Source, Destination>().ForMember(dest => dest.Property, opt => opt.ResolveUsing<CustomResolver>());

這些是AutoMapper的一些高階應用,可以幫助你更靈活地處理物件對映的各種情況。通過合理的設定和擴充套件AutoMapper,可以簡化程式碼並提高開發效率.

更多技術文章,技術資源請關注公眾號:架構師寶庫

作者簡介:
公眾號【架構師寶庫】,頭條號【架構師老盧】20年資深軟體架構師,分享程式設計、軟體設計經驗,教授前沿技術,分享技術資源(每天分享一本電子書),分享職場感悟。