1

私は自分の会社用に新しい 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
}

両方の方法をバインドするのは良い設計ですか? または、私が見逃しているより良い解決策があります。助けてください

ありがとう、サンジェイ

4

2 に答える 2

2

ジミー・ボガードも同じ質問をしました。しかし、あなたがリストしたような単純なケースに直接サポートが追加されたという十分な需要がありました. 実際、この回答で、ジミーは、それがうまくいくのであれば何も問題はないことも示唆しています. 簡単な例は次のとおりです。

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

ReverseMapより複雑なマッピングでは機能しないことに注意してください。詳細については、この回答を参照してください。

于 2013-01-09T19:56:53.077 に答える
1

オートマッパーは、ドメインからビューモデルへ(説明した方法でドメインからDTOへ)マッピングに構築されました

ここで@Mariusの回答でうまくまとめられています双方向マッピングの何が問題なのですか?

一部の中規模のプロジェクトでは双方向マッピングを使用し、大規模なプロジェクトでは Domain To View Model マッピングを使用し、CQRSシステムを使用して ViewModel 値を基になる永続ストアに送信しました。

結局のところ、Automapper をどのように使用するか、どのようなアーキテクチャ上の決定が意味を持つかは、あなた次第です。

2 方向マッピングを行うと、世界は回転を停止しません。

于 2013-01-09T06:28:03.613 に答える