2013-01-09 100 views
1

我正在爲我公司開發一個新的MVC網站&如何創建從Domain/POCO對象到ViewModel類的映射[包含驗證] &反之亦然。這裏是一個示例。將域對象映射到ViewModel反之亦然使用Automapper

我的領域類[只是爲了保持它的簡單I'hv省略其他屬性]:

public partial class Glossary 
{ 
    public int Id { get; set; } 
    public string GlossaryItem { get; set; } 
    public string Definition { get; set; } 
} 

我的我的MVC應用程序的模型文件夾視圖模型類[與corrosponding驗證]:

public class GlossaryModel 
{ 
    [HiddenInput(DisplayValue = false)] 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Please enter a GlossaryItem")] 
    public string GlossaryItem { get; set; } 

    [Required(ErrorMessage = "Please enter a Definition")] 
    public string Definition { get; set; } 
} 

我的自動映射配置爲DTO域模型:

protected override void Configure() 
{ 
    CreateMap<GlossaryModel, Glossary>(); 
    //....... etc 
} 

我的控制器的行爲m ethod編輯項:

public class GlossaryController : Controller 
{ 
    IGlossaryRepository _glossaryRepository; 
    IMappingService _mappingService; 

    public GlossaryController(IGlossaryRepository glossaryRepository, IMappingService autoMapperMappingService) 
    { 
     _glossaryRepository = glossaryRepository; 
     _mappingService = autoMapperMappingService; 
    } 

    // .... etc 

    [HttpPost, ValidateAntiForgeryToken] 
    public virtual ActionResult Edit(GlossaryModel glossaryModel) 
    { 
     if (ModelState.IsValid) 
     { 
      var glossary = _mappingService.Map<GlossaryModel, Glossary>(glossaryModel); 
      if (glossaryModel.Id <= 0) 
       _glossaryRepository.Add(glossary); 
      else 
       _glossaryRepository.Edit(glossary); 
      _glossaryRepository.Save(); 
      TempData["message"] = string.Format("{0} has been saved", glossaryModel.Definition); 
      return RedirectToAction("All"); 
     } 
     return View(glossaryModel); 
    } 

    //....etc 
} 

,它的工作很好,但我的問題是...現在說我需要一個動作,將列出了所有詞彙的項目,如..

public ActionResult All() 
{ 
    var allItems = _glossaryRepository.Glossary; 
    if (allItems.Count() == 0) return View(new List<GlossaryModel>()); 
    // **The below line is the reverse mapping one** 
    var allItemsModel = _mappingService.Map<IEnumerable<Glossary>, IEnumerable<GlossaryModel>>(allItems); 
    return View(allItemsModel); 
} 

但現在我需要automapper轉換從域對象到DTO [從列表(表)列出(GlossaryModel)],對面編輯方法的,將數據推送到圖。所以我再次需要在automapper配置中映射相反的綁定...... !!像

protected override void Configure() 
{ 
    CreateMap<GlossaryModel, Glossary>(); // Added before for DTO to Domain object 
    CreateMap<Glossary, GlossaryModel>();// Added for Domain object to DTO 
    //....... etc 
} 

這是一個很好的設計來綁定兩種方式嗎?還是有更好的解決辦法我失去了,請幫

感謝, 桑傑

+0

爲什麼你不只是在你的視圖中使用你的域模型?即保持簡單 – viperguynaz

+1

@viperguynaz KISS並不真正適用於在視圖中使用域模型 - 問題與張貼超越,只有屬性出血到域對象等 – heads5150

+0

@viperguynaz我還有其他領域的對象的其他很多屬性我不需要在head5150解釋的視圖中... :) – user1841842

回答

1

Automapper是建立到域到視圖模型(域到DTO在其中你描述它的方式)映射

通過@Marius'答案在這裏What is wrong with two-way mapping?

在我使用雙向映射一些中型項目和我使用域要視圖模型映射較大的項目,概括起來很好,然後使用CQRS系統發送視圖模型值Ť他潛在的持久性存儲。

當涉及到它時,您決定如何選擇使用Automapper以及哪些體系結構決策對您有意義。

世界不會停止,如果你這樣做雙向映射旋轉。

+0

感謝Marius的鏈接......非常好的解釋。我正在建立的當前網站並不那麼複雜,所以我想我可以用這個雙向映射。與此同時,探索CQRS,因爲我認爲它更適合CRUD,比如網站,這對於未來的參與很有幫助。 – user1841842

2

吉米·博加德還要求same question。但有它足夠的需求,對於簡單的情況下直接支持has been added像你所列出。事實上,在this answer吉米還建議,如果它適合你,沒有什麼問題。一個簡單的例子是:

protected override void Configure() 
{ 
    CreateMap<GlossaryModel, Glossary>() 
     .ReverseMap(); 
    //....... etc 
} 

請注意ReverseMap不適用於更復雜的映射。詳情請參閱this answer

相關問題