【C#】AutoMapper 使用手冊
阿新 • • 發佈:2020-06-12
[TOC]
> 本文基於 AutoMapper 9.0.0
AutoMapper 是一個物件-物件對映器,可以將一個物件對映到另一個物件。
官網地址:http://automapper.org/
官方文件:https://docs.automapper.org/en/latest/
### 1 入門例子
```csharp
public class Foo
{
public int ID { get; set; }
public string Name { get; set; }
}
public class FooDto
{
public int ID { get; set; }
public string Name { get; set; }
}
public void Map()
{
var config = new MapperConfiguration(cfg => cfg.CreateMap());
var mapper = config.CreateMapper();
Foo foo = new Foo { ID = 1, Name = "Tom" };
FooDto dto = mapper.Map(foo);
}
```
### 2 註冊
在使用 `Map` 方法之前,首先要告訴 AutoMapper 什麼類可以對映到什麼類。
```csharp
var config = new MapperConfiguration(cfg => cfg.CreateMap());
```
每個 AppDomain 只能進行一次配置。這意味著放置配置程式碼的最佳位置是在應用程式啟動中,例如 ASP.NET 應用程式的 Global.asax 檔案。
從 9.0 開始 `Mapper.Initialize` 方法就不可用了。
#### 2.1 Profile
`Profile` 是組織對映的另一種方式。新建一個類,繼承 `Profile`,並在建構函式中配置對映。
```csharp
public class EmployeeProfile : Profile
{
public EmployeeProfile()
{
CreateMap();
}
}
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile();
});
```
`Profile` 內部的配置僅適用於 `Profile` 內部的對映。應用於根配置的配置適用於所有建立的對映。
AutoMapper 也可以在指定的程式集中掃描從 `Profile` 繼承的類,並將其新增到配置中。
```csharp
var config = new MapperConfiguration(cfg =>
{
// 掃描當前程式集
cfg.AddMaps(System.AppDomain.CurrentDomain.GetAssemblies());
// 也可以傳程式集名稱(dll 名稱)
cfg.AddMaps("LibCoreTest");
});
```
### 3 配置
#### 3.1 命名約定
預設情況下,AutoMapper 基於相同的欄位名對映,並且是 **不區分大小寫** 的。
但有時,我們需要處理一些特殊的情況。
- `SourceMemberNamingConvention` 表示源型別命名規則
- `DestinationMemberNamingConvention` 表示目標型別命名規則
`LowerUnderscoreNamingConvention` 和 `PascalCaseNamingConvention` 是 AutoMapper 提供的兩個命名規則。前者命名是小寫幷包含下劃線,後者就是帕斯卡命名規則(每個單詞的首字母大寫)。
我的理解,如果源型別和目標型別分別採用了 **蛇形命名法** 和 **駝峰命名法**,那麼就需要指定命名規則,使其能正確對映。
```csharp
public class Foo
{
public int Id { get; set; }
public string MyName { get; set; }
}
public class FooDto
{
public int ID { get; set; }
public string My_Name { get; set; }
}
public void Map()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap();
cfg.SourceMemberNamingConvention = new PascalCaseNamingConvention();
cfg.DestinationMemberNamingConvention = new LowerUnderscoreNamingConvention();
});
var mapper = config.CreateMapper();
Foo foo = new Foo { Id = 2, MyName = "Tom" };
FooDto dto = mapper.Map(foo);
}
```
#### 3.2 配置可見性
預設情況下,AutoMapper 僅對映 `public` 成員,但其實它是可以對映到 `private` 屬性的。
```csharp
var config = new MapperConfiguration(cfg =>
{
cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.SetMethod.IsPrivate;
cfg.CreateMap