私は自分の会社用に新しい MVC サイトを開発していますが、ドメイン/POCO オブジェクトから ViewModel クラス [検証を含む] へのマッピングを作成する方法とその逆の方法について混乱しています。サンプルの例を次に示します。
私のドメインクラス[単純にするために、他のプロパティを省略しました]:
public partial class Glossary
{
public int Id { get; set; }
public string GlossaryItem { get; set; }
public string Definition { get; set; }
}
MVC アプリのモデル フォルダー内の ViewModel クラス [対応する検証あり]:
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 からドメイン モデルへの Automapper 構成:
protected override void Configure()
{
CreateMap<GlossaryModel, Glossary>();
//....... etc
}
アイテムを編集するためのコントローラーのアクション メソッド:
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);
}
しかし今、データをビューにプッシュするために、Edit メソッドのちょうど反対に、Domain オブジェクトから DTO [List(Glossary) から List(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
}
両方の方法をバインドするのは良い設計ですか? または、私が見逃しているより良い解決策があります。助けてください
ありがとう、サンジェイ