AutoMapper官方文件(二)【升級指南】
初始化
您現在必須使用Mapper.Initialize
或new MapperConfiguration()
來初始化AutoMapper
。如果您希望保持靜態使用,請使用Mapper.Initialize
。
如果你有很多的Mapper.CreateMap
呼叫,把它們移動到一個Profile
,或者Mapper.Initialize
,在啟動時呼叫一次。
例如在這裡看到。
Profiles
不要覆蓋Configure方法,而是直接通過建構函式進行配置:
public class MappingProfile : Profile {
public MappingProfile() {
CreateMap<Foo, Bar>();
RecognizePrefix("m_"); } }
IgnoreAllNonExisting擴充套件
一個流行的 Stack Overflow文章介紹了忽略目標型別上的所有不存在的成員的想法。 它使用配置API中不再存在的東西。 該功能實際上僅用於配置驗證。
在5.0中,您可以使用在成員列表列舉中傳遞的ReverseMap
或CreateMap
來針對源成員(或沒有成員)進行驗證。 任何你有這個IgnoreAllNonExisting
副檔名的地方,都可以使用CreateMap
過載來對源或者非成員進行驗證:
cfg.CreateMap<ProductDto, Product>(MemberList.None);
解決上下文事情
ResolutionContext
用於捕獲大量資訊,源和目標值以及分層父模型。 對於源/目標值,所有介面(值解析器和型別轉換器)以及配置選項現在包括源/目標值,以及源/目標成員(如果適用)。
如果您試圖訪問模型中的某個父物件,則需要將這些關係新增到模型中,並通過這些關係訪問它們,而不是通過AutoMapper的層次結構訪問它們。 ResolutionContext由於效能和健全的原因而被削減。
值解析器
值解析器的簽名已更改為允許訪問源/目標模型。 另外,基類已經不再用於介面。 對於沒有成員重定向的值解析器,介面現在是:
public interface IValueResolver<in TSource, in TDestination, TDestMember>
{
TDestMember Resolve(TSource source, TDestination destination, TDestMember destMember, ResolutionContext context);
}
您現在可以訪問此解析器針對的源模型,目標模型和目標成員。
如果您正在使用ResolveUsing
並傳遞FromMember
配置,則現在這是一個新的解析器介面:
public interface IMemberValueResolver<in TSource, in TDestination, in TSourceMember, TDestMember> { TDestMember Resolve(TSource source, TDestination destination, TSourceMember sourceMember, TDestMember destMember, ResolutionContext context); }
這現在被直接配置為
ForMember(dest => dest.Foo, opt => opt.ResolveUsing<MyCustomResolver, string>(src => src.Bar)
型別轉換器
型別轉換器的基類現在已經變成了接受源和目標物件並返回目標物件的單一介面:
public interface ITypeConverter<in TSource, TDestination>
{
TDestination Convert(TSource source, TDestination destination, ResolutionContext context);
}
以前,AutoMapper
可以通過跟蹤所對映的內容來處理迴圈引用,並且在每個對映上檢查源/目標物件的本地散列表,以檢視該項是否已被對映。 事實證明,這種跟蹤是非常昂貴的,你需要選擇使用PreserveReferences
迴圈對映工作。 或者,您可以配置MaxDepth
:
//自引用對映
cfg.CreateMap<Category, CategoryDto>().MaxDepth(3);
//users和groups之間的迴圈引用
cfg.CreateMap<User, UserDto>().PreserveReferences();
從6.1.0開始,只要靜態檢測到遞迴,就可以在配置時自動設定PreserveReferences
。 如果在您的情況下沒有發生這種情況,請使用完整的repro開啟一個問題,我們會研究它。
UseDestinationValue
UseDestinationValue
告訴AutoMapper
不要為某個成員建立一個新的物件,而是使用目標物件的現有屬性。 它以前是預設的。 考慮這是否適用於你的情況。
cfg.CreateMap<Source, Destination>()
.ForMember(d => d.Child, opt => opt.UseDestinationValue());
【轉載於CSDN風鈴使】