2013-05-13 3 views
14

Ich möchte das Ansichtsmodell für die Anzeige des Domänenmodells verwenden. Und ich möchte eine Eigenschaft für die Anzeige anpassen, wie soll ich das tun? Und ist es eine gute Übung, AutoMapper für die Anzeige zu verwenden?Zuordnen des Domänenmodells zum Anzeigen des Modells über AutoMapper oder nicht

Unten ist der Code Beispiel:

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; } 
    } 

Wenn ich eine andere Art und Weise zu verwenden, ich jede Eigenschaft anpassen kann, wie unten:

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; } 
    } 

Wie soll ich das tun? Und ist es eine gute Übung, AutoMapper für die Anzeige zu verwenden?

aktualisieren

Es ist im Szenario unter Verwendung AutoMapper scheint besser geeignet ist. Zum Beispiel das Zuordnen eines Ansichtsmodells zum Domänenmodell wie unten. Irgendwelche Meinungen?

[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(); 
     } 
    } 

Update 2

Für über View-Modell komplexe benutzerdefinierte Anzeige, möchte ich nicht AutoMapper verwenden Anzeigelogik abzubilden, AutoMapper vorausgesetzt, es abbilden kann. Weil es verschiedene Zwecke mischt. Zum Beispiel:

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

Allerdings scheint die Verwendung der manuellen Zuordnung wie unten intuitiv.

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

Update 3

Zitat von Jimmy Bogard:

ich AutoMapper denke, mit, weil du die „=“ Operator nicht verwenden wollen, ist etwas faul. Stattdessen verwenden wir es zum Glätten und Umformen, Optimierung für die Umgebung des Zieltyps. Denken Sie daran, meine ursprüngliche Motivation für AutoMapper war:

Aktivieren Sie die Domäne Schicht von anderen Schichten durch Zuordnung zu DTOs

Dank @AndrewWhitaker für den Link zu schützen

+2

Pro Update 2, wie mischt es verschiedene Zwecke? Ist das Ziel des ViewModels nicht das Anzeigen eines Domänenmodells? Automapper ist nur ein Vehikel dafür. –

+0

Es vergleicht mit anderen Zuordnungen, zum Beispiel Domäne zu dto, die nicht angezeigt wird, und wahrscheinlich sauber. – Pingpong

+0

Sie würden ein völlig anderes Mapping für Domain '->' DTO erstellen. Außerdem sollten Sie AutoMapper nicht verwenden, um von einer beliebigen TO-Domäne aus zuzuordnen. –

Antwort

18

Dies ist ein guter Anwendungsfall für AutoMapper (Ich habe es ausgiebig bei vielen Projekten mit Erfolg benutzt). Im Allgemeinen tun Sie nicht wollen Domain-Entities zu Ihrer Ansicht (in MVC würde dies Ihr Modell direkt zu Ihrer Ansicht ausgesetzt, die inkorrekt ist).

Sie brauchen keine 1-1-Zuordnung zwischen Domain-Entity und Viewmodel. Sie können sie völlig anders aussehen lassen und das Mapping in Ihrem CreateMap<> Anruf anpassen. So verwenden Sie Ihr Beispiel:

Mapper.CreateMap<Book, BookView>() 
    .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name + " Decorated")); 

Im schlimmsten Fall können Sie AutoMapper für komplexe Fälle Graben oder einen benutzerdefinierten Typ Resolver mit AutoMapper verwenden, um den Job zu erledigen.

Tatsächlich, this is how Jimmy Bogard (the author) recommends using AutoMapper. Er erwähnt speziell die Zuordnung von Domänenentitäten zu ASP.NET MVC ViewModels zur Verwendung mit stark typisierten Ansichten.

Ein weiterer Vorteil ist, dass Sie Ihre Mapping-Profile testen können. Auf diese Weise erhalten Sie einen fehlerhaften Komponententest, wenn Sie zwischen ViewModel und Model nicht übereinstimmen.

Updates:

denke ich das Zitat Sie auf Ihre Frage weiteren Stützen für die Zuordnung von Domain-Modelle Viewmodels mit AutoMapper hinzugefügt:

Stattdessen wir sie verwenden zu glätten und neu zu gestalten, zu optimieren für die Umgebung des Zieltyps.

So in meinem Beispiel würden Sie auf jeden Fall Optimierung für die Umgebung des Zieltyp sein (in diesem Fall eine Ansicht).

auch per Link ich oben Sie verweisen sollte nicht sein AutoMapper mit - die Domäne abzubilden, nur von. In diesem Sinne müssen Sie eine Logik schreiben, um Domain-Entitäten aus dem, was Sie von der View erhalten, zu erstellen/zu aktualisieren, egal was passiert. Denken Sie daran, dass Controller-Aktionen Domänen-Entities nicht direkt übernehmen sollten (Sie sollten nicht auf Daten vertrauen, die direkt von der View kommen - lassen Sie das Modell bestimmen, ob eine Domain-Entity gültig wäre oder nicht).

+1

Gibt es basierend auf Ihren Updates (hilfreich) Beispiele oder Links zum Konvertieren des Ansichtsmodells in das Domänenmodell mit Ansichtsmodellvalidierung? – Pingpong

+0

Ich verstehe es nicht deinen letzten Absatz. Meinst du, wir sollten keinen Autoadapter von ViewModel zu Domäne (POCO) zuordnen? Wenn ja, wie können Benutzereingaben (View) in die Datenbank (Model) gespeichert werden? durch manuelle Zuordnung? – Willy

+0

@Willy: Ja, indem Sie eine manuelle Zuordnung vornehmen. Die Idee ist, dass die Domäne zu wichtig ist, um eine automatische Zuordnung zu ermöglichen. –

Verwandte Themen