19

ドメインモデルの代わりにビューモデルを表示に使いたいです。また、表示用にプロパティをカスタマイズしたいのですが、どうすればよいですか? また、表示に AutoMapper を使用することは良い習慣ですか?

以下はコードサンプルです。

public class BookController : BaseController
    {
        private IBookService bookService;

        public BookController(IBookService bookService)
        {
            this.bookService = bookService;
        }

        public ActionResult Details(int id)
        {
            var book = bookService.GetBookById(id);

            return View(Mapper.Map<BookView>(book));
        }
}

    public class Book 
    {        
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
    }

    public class BookView
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

別の方法を使用すると、以下のように任意のプロパティをカスタマイズできます。

  public ActionResult Details(int id)
        {
            var book = bookService.GetBookById(id);

            return View(new BookView(book));
        }

    public class BookView
    {
       public BookView(Book book){
         Name = book.Name +" Decorated";
       }
        public int Id { get; set; }
        public string Name { get; set; }
    }

どうすればいいですか?また、表示に AutoMapper を使用することは良い習慣ですか?

アップデート

以下のシナリオでは automapper を使用する方が適切なようです。たとえば、以下のようにビュー モデルをドメイン モデルにマッピングします。ご意見はありますか?

  [HttpPost]
    public ActionResult Create(BookView bookView)
    {
        try
        {
            var book = Mapper.Map<Book>(bookView);  //this is wrong

            bookService.SaveOrUpdate(book);

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

更新 2

ビューモデルを介した複雑なカスタム表示の場合、オートマッパーがマップできると仮定して、オートマッパーを使用して表示ロジックをマップしたくありません。さまざまな目的が混在しているからです。例えば:

Mapper.CreateMap<Book, BookView>()
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name + " this is for display purpose"));

ただし、以下のような手動マッピングの使用は直感的に思えます。

 public BookView(Book book){
    //mapping here
}

アップデート 3

ジミー・ボガードからの引用:

「=」演算子を使用したくないので AutoMapper を使用するのは少し面倒だと思います。代わりに、それを使用してフラット化および再形成し、宛先タイプの環境に合わせて最適化します。覚えておいてください、AutoMapper の最初の動機は次のとおりでした。

DTO へのマッピングにより、ドメイン層を他の層から保護できるようにする

リンクをありがとう@AndrewWhitaker

4

1 に答える 1