17.AutoMapper 之配置(Configuration)

配置(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)景。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吕喘,一起剝皮案震驚了整個(gè)濱河市赘那,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氯质,老刑警劉巖募舟,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異闻察,居然都是意外死亡拱礁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門辕漂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呢灶,“玉大人,你說我怎么就攤上這事钉嘹⊙炷耍” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵跋涣,是天一觀的道長(zhǎng)缨睡。 經(jīng)常有香客問我,道長(zhǎng)陈辱,這世上最難降的妖魔是什么奖年? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮性置,結(jié)果婚禮上拾并,老公的妹妹穿的比我還像新娘揍堰。我一直安慰自己鹏浅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布屏歹。 她就那樣靜靜地躺著隐砸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝙眶。 梳的紋絲不亂的頭發(fā)上季希,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天褪那,我揣著相機(jī)與錄音,去河邊找鬼式塌。 笑死博敬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的峰尝。 我是一名探鬼主播偏窝,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼武学!你這毒婦竟也來了祭往?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤火窒,失蹤者是張志新(化名)和其女友劉穎硼补,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熏矿,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡已骇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了票编。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疾捍。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栏妖,靈堂內(nèi)的尸體忽然破棺而出乱豆,到底是詐尸還是另有隱情,我是刑警寧澤吊趾,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布宛裕,位于F島的核電站,受9級(jí)特大地震影響论泛,放射性物質(zhì)發(fā)生泄漏揩尸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一屁奏、第九天 我趴在偏房一處隱蔽的房頂上張望岩榆。 院中可真熱鬧,春花似錦坟瓢、人聲如沸勇边。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粒褒。三九已至,卻和暖如春诚镰,著一層夾襖步出監(jiān)牢的瞬間奕坟,已是汗流浹背祥款。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留月杉,地道東北人刃跛。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像苛萎,于是被迫代替她去往敵國(guó)和親奠伪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí)首懈,會(huì)觸發(fā)此異常绊率。 O...
    我想起個(gè)好名字閱讀 5,317評(píng)論 0 9
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,911評(píng)論 2 11
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,101評(píng)論 1 32
  • 原圖臨摹kirara知更鳥,買了她的書呢究履。
    陽光貝拉閱讀 283評(píng)論 0 3
  • 圖片發(fā)自簡(jiǎn)書App 1.我要詩滤否,也要遠(yuǎn)方 投遞簡(jiǎn)歷,定好車票最仑,打包一個(gè)月以來的舒適和不安藐俺,去往一片熱土,深圳泥彤。 也...
    Judydy閱讀 296評(píng)論 4 0