2016/12/29

AutoMapper - 自動對應 Model

寫了一年多的 MVC 後,發現強型別真是太方便了。透過 Model Binding 的方式,真的加快了程式開發效率。不過若專案功能很龐大時,免不了多了很多為了功能而制定的 ViewModel,因此若沒有工具來協助,要將 ViewModel 取得的資料對應到 Model,真的手會打到斷啊! 還好,發現了 AutoMapper 套件,真是拯救了我啊!

假設目前有一個檔案資訊的 Model
public class FilesInfo
{
  public Guid FILE_ID { get; set; }        
  public string MODULE_ID { get; set; }
  public Guid? REF_CONTENT_ID { get; set; }
  public string FILE_TITLE { get; set; }
  public string FILE_FILENAME { get; set; }
  public string FILE_DL_FILENAME { get; set; }
  public int FILE_DL_TYPE { get; set; }
  public string FILE_PATH { get; set; }
  public string FILE_LINK { get; set; }
  public string FILE_URL { get; set; }
  public string FILE_DESCRIPTION { get; set; }
  public bool IS_ACTIVE { get; set; }
}

此時因為頁面上的功能設計關係,我不需要原來 FilesInfo 中那麼多欄位,但需要添加一個註解 (Remark) 的屬性,所以 ViewModel 會變成這樣:
public class FileInfoEditViewModel
{
  public Guid FILE_ID { get; set; }
  public string FILE_TITLE { get; set; }
  public string FILE_LINK { get; set; }
  public string FILE_URL { get; set; }
  public string FILE_DESCRIPTION { get; set; }
  public bool IS_ACTIVE { get; set; }

  //New property
  public string Remark { get; set; }
}


現在,要將自 DB 取到的 FilesInfo 資訊直接對應到 FileInfoEditViewModel 內。當然可以用傳統土法鍊鋼方式一筆筆設定,但這次直接用 AutoMapper,幾行程式就搞定啦!
var file = context.FILE_INFO.Find("id_1");
Mapper.Initialize(x => x.CreateMap());
//我比較偏好這樣: Mapper.Initialize(x => x.CreateMap()); 比較能知道由哪個 Model 對應到哪個 Model
Mapper.Initialize(x => x.CreateMap var mFileInfoEdit = Mapper.Map(file);

上面程式碼執行後,因 FilesInfo 沒有 Remark 對應 Property, 所以 Remark 獲得 NULL。若要在 Mapping 的時候直接給定預設值,可以用 ForMember 指定:
Mapper.Initialize(x => x.CreateMap()
.ForMember(dest => dest.Remark, opt => opt.MapFrom(src => DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " 建立"))
);
model.FileInfoEdit = Mapper.Map(file);

很方便吧!

AutoMapper:
https://github.com/AutoMapper/AutoMapper/wiki

沒有留言 :

張貼留言

注意:只有此網誌的成員可以留言。