我正在爲我公司開發一個新的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
}
這是一個很好的設計來綁定兩種方式嗎?還是有更好的解決辦法我失去了,請幫
感謝, 桑傑
爲什麼你不只是在你的視圖中使用你的域模型?即保持簡單 – viperguynaz
@viperguynaz KISS並不真正適用於在視圖中使用域模型 - 問題與張貼超越,只有屬性出血到域對象等 – heads5150
@viperguynaz我還有其他領域的對象的其他很多屬性我不需要在head5150解釋的視圖中... :) – user1841842