AutoMapper 幫我我們方便管理物件跟物件之間屬性值格式轉換
模型轉換
這裡有兩個類別
UserInfoModel 當作我們從DB撈取出來 模型資料
public class UserInfoModel
{
public int RowId { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
UserInfoViewModel 是呈現在UI或其他地方的模型
其中 Detail
欄位由 UserInfoModel
的 Name
和 Age
屬性組成的
public class UserInfoViewModel
{
public string Detail { get; set; }
}
這時我們就會引用 AutoMapper 幫我們統一管理轉換模型上的問題
建立一個Profile
設置UserInfoModel
對於 UserInfoViewModel
之前的欄位轉換
public class UserInfoProfile : Profile
{
public UserInfoProfile()
{
CreateMap<UserInfoModel, UserInfoViewModel>()
.ForMember(t => t.Detail,
s => s.MapFrom(_ => $"DetailInfo:{_.Name} {_.Age}"));
}
}
而我們在註冊時會呼叫 AddProfile
方法
Mapper.Initialize(x => x.AddProfile<UserInfoProfile>());
但每次新加Profile這邊都需要設置新的Profile,我們就會想有沒有方法可以讓他自動註冊?
我們可以使用反射來完成
反射自動註冊AutoMapper Profile
此程式我使用我的 ExtenionTool
var profiles = Assembly.GetExecutingAssembly()
.GetInstancesByAssembly<Profile>();
foreach (var profile in profiles)
{
Mapper.Initialize(x => x.AddProfile(profile));
}
上面程式碼很簡單清晰,呼叫 GetInstancesByAssembly
取得目前組件所有的 Profile
物件實體並且加到Profile
中,我們將上面程式碼在初始化執行一次
public static IEnumerable<TResult> GetInstancesByAssembly<TResult>(this Assembly ass)
{
return ass.GetTypes()
.Where(x => typeof(TResult).IsAssignableFrom(x) && x.IsNormalClass())
.Select(x => Activator.CreateInstance(x))
.Cast<TResult>();
}
核心程式使用Linq 動態取得你所需的類型並使用反射創建
之後我們就可以不用在手動把Profile
加至AutoMapper
容器中了
如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^