配置(Configuration)
通過構(gòu)造函數(shù)創(chuàng)建并初始化MapperConfiguration
實(shí)例:
config = new MapperConfiguration(cfg => {
cfg.CreateMap<Foo, Bar>();
cfg.AddProfile<FooProfile>();
});
MapperConfiguration
可以靜態(tài)存儲(chǔ)在靜態(tài)字段或者依賴注入容器中。一經(jīng)創(chuàng)建就無法更改/修改昨凡。
或者人断,您可以使用靜態(tài)Mapper實(shí)例初始化AutoMapper:
Mapper.Initialize(cfg => {
cfg.CreateMap<Foo, Bar>();
cfg.AddProfile<FooProfile>();
});
配置文件實(shí)例
使用配置文件來組織你的映射配置是一個(gè)很好的方式。創(chuàng)建繼承自Profile的類并把配置寫在構(gòu)造函數(shù)中:
// 這種方式從5.0版本開始
public class OrganizationProfile : Profile
{
public OrganizationProfile()
{
CreateMap<Foo, FooDto>();
// 在這里使用 CreateMap... 等等 (Profile 方法跟 Configuration方法一致)
}
}
// 4.x到5.0版本纤子,使用以下方式,不過這已經(jīng)過時(shí)了:
// public class OrganizationProfile : Profile
// {
// protected override void Configure()
// {
// CreateMap<Foo, FooDto>();
// }
// }
在早期版本中Configure
方法用來代替構(gòu)造函數(shù)款票。在5.0版本中控硼,Configure()
已經(jīng)過時(shí)并在6.0版本中移除。
Configuration 內(nèi)部的配置文件僅適用于配置文件內(nèi)部的映射艾少。Configuration 應(yīng)用于根配置卡乾,則適用于所有被創(chuàng)建的映射。
自動(dòng)配置之程序集掃描
配置文件有多種方式可以直接添加到主映射配置中:
cfg.AddProfile<OrganizationProfile>();
cfg.AddProfile(new OrganizationProfile());
or by automatically scanning for profiles:
// 在程序集中掃描所有配置
//使用實(shí)例的方式:
var config = new MapperConfiguration(cfg => {
cfg.AddProfiles(myAssembly);
});
//使用靜態(tài)的方式:
Mapper.Initialize(cfg => cfg.AddProfiles(myAssembly));
//也可以使用程序集名稱:
Mapper.Initialize(cfg =>
cfg.AddProfiles(new [] {
"Foo.UI",
"Foo.Core"
});
);
// 還可以使用程序集類型:
Mapper.Initialize(cfg =>
cfg.AddProfiles(new [] {
typeof(HomeController),
typeof(Entity)
});
);
Automapper將掃描指定的程序集缚够,將繼承自Profile的類添加到配置中幔妨。
命名約定
你可以設(shè)置源和目標(biāo)的命名約定
Mapper.Initialize(cfg => {
cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
});
以下屬性將相互映射:property_name - > PropertyName
。
你也可以在每個(gè)配置文件級(jí)別設(shè)置命名約定谍椅。
public class OrganizationProfile : Profile
{
public OrganizationProfile()
{
SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
DestinationMemberNamingConvention = new PascalCaseNamingConvention();
//將CreateMap 等等放在這里
}
}
字符替換
你也可以在成員名字匹配期間替換源成員的單個(gè)字符或單詞:
public class Source
{
public int Value { get; set; }
public int ?víator { get; set; }
public int SubAirlinaFlight { get; set; }
}
public class Destination
{
public int Value { get; set; }
public int Aviator { get; set; }
public int SubAirlineFlight { get; set; }
}
替換一個(gè)字符或者轉(zhuǎn)換一個(gè)單詞:
Mapper.Initialize(c =>
{
c.ReplaceMemberName("?", "A");
c.ReplaceMemberName("í", "i");
c.ReplaceMemberName("Airlina", "Airline");
});
識(shí)別前/后綴
某些時(shí)候你的源/目標(biāo)成員有公共的前/后綴這使得因?yàn)槊Q不匹配導(dǎo)致你需要定義一堆自定義成員映射误堡。可以使用識(shí)別前/后綴來解決這個(gè)問題:
public class Source {
public int frmValue { get; set; }
public int frmValue2 { get; set; }
}
public class Dest {
public int Value { get; set; }
public int Value2 { get; set; }
}
Mapper.Initialize(cfg => {
cfg.RecognizePrefixes("frm");
cfg.CreateMap<Source, Dest>();
});
Mapper.AssertConfigurationIsValid();
AutoMapper 默認(rèn)識(shí)別"Get"前綴雏吭,如果你需要清除該前綴:
Mapper.Initialize(cfg => {
cfg.ClearPrefixes();
cfg.RecognizePrefixes("tmp");
});
全局屬性/字段過濾
AutoMapper默認(rèn)嘗試映射所有的公共屬性/字段锁施。你可以使用屬性/字段過濾器來過濾掉屬性/字段:
Mapper.Initialize(cfg =>
{
// 不映射任何字段
cfg.ShouldMapField = fi => false;
// 映射getter為公共或私有的屬性
cfg.ShouldMapProperty = pi =>
pi.GetMethod != null && (pi.GetMethod.IsPublic || pi.GetMethod.IsPrivate);
});
配置可見性
AutoMapper默認(rèn)只識(shí)別公共成員。雖然也能映射私有setters杖们,但是會(huì)跳過整個(gè)屬性為internal/private中internal/private的方法和屬性悉抵。為了教會(huì)AutoMapper識(shí)別其它可見級(jí)別的成員,覆蓋默認(rèn)過濾器ShouldMapField摘完、ShouldMapProperty:
Mapper.Initialize(cfg =>
{
// 映射getter 可見級(jí)別為public 或者internal 的屬性
cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
cfg.CreateMap<Source, Destination>();
});
Map 配置現(xiàn)在將識(shí)別 internal/private 成員姥饰。
Configuration 編譯
因?yàn)楸磉_(dá)式編譯可能會(huì)占用大量資源,所以AutoMapper延遲編譯類型映射孝治,并計(jì)劃在第一次執(zhí)行映射的時(shí)候編譯列粪。但是栅螟,這種行為并不能總讓人滿意,所以你也可以告訴AutoMapper直接編譯映射:
Mapper.Initialize(cfg => {});
Mapper.Configuration.CompileMappings();
對(duì)于幾百個(gè)映射篱竭,這可能需要幾秒鐘力图。
重置靜態(tài)映射配置
靜態(tài)Mapper.Initialize意味著只被調(diào)用一次。重置的靜態(tài)映射配置(例如掺逼,在測(cè)試開始時(shí)):
Mapper.Reset();
Mapper.Initialize(cfg => { /* 重新配置 */ });
不應(yīng)在生產(chǎn)代碼中使用重置吃媒。它的意義在于支持測(cè)試場(chǎng)景。