2012-03-28 3 views
4

Ich habe hier http://lostechies.com/jimmybogard/2009/09/18/the-case-for-two-way-mapping-in-automapper/ darüber gelesen, wie Sie wahrscheinlich nicht versuchen, ein abgeflachtes Objekt zu entlasten, sondern darüber nachdenken, wie ich ein Repository mit Entity verwenden Framework werden die Entity-Modelle erwartet, nicht die ViewModels.Domain-Modell zu ViewModel und wieder mit Repository-Muster und Entity Framework in MVC3

Ich begann mich zu fragen, ob ich einen anderen Ansatz verfolgen sollte, hat jemand Best Practices für so etwas? oder ist es an der Zeit, ValueInjector Using AutoMapper to unflatten a DTO zu verwenden? und nicht zu sehr damit beschäftigt, RecipeCreateViewModel zurück zu Rezept zu mappen?

Unten ist mein Code, um Ihnen eine Vorstellung davon zu geben, was ich im Moment habe.

// Entities 
public class Recipe { 
    public int Id { get; set; } 

    public string Name { get; set; } 
    public Course Course { get; set; } 
} 

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

// View Model 
public class RecipeCreateViewModel { 
    // Recipe properties 
    public int Id { get; set; } 
    public string Name { get; set; } 

    // Course properties, as primitives via AutoMapper 
    [Required] 
    public int CourseId { get; set; } 
    // Don't need CourseName in the viewmodel but it should probably be set in Recipe.Course.Name 
    //public string CourseName { get; set; } 

    // For a drop down list of courses 
    public SelectList CourseList { get; set; } 
} 


// Part of my View 
@model EatRateShare.WebUI.ViewModels.RecipeCreateViewModel 
... 
<div class="editor-label"> 
    Course 
</div> 
<div class="editor-field"> 
    @* The first param for DropDownListFor will make sure the relevant property is selected *@ 
    @Html.DropDownListFor(model => model.CourseId, Model.CourseList, "Choose...") 
    @Html.ValidationMessageFor(model => model.CourseId) 
</div> 
... 


// Controller actions 

public ActionResult Create() { 
    // map the Recipe to its View Model 
    var recipeCreateViewModel = Mapper.Map<Recipe, RecipeCreateViewModel>(new Recipe()); 
    recipeCreateViewModel.CourseList = new SelectList(courseRepository.All, "Id", "Name"); 
    return View(recipeCreateViewModel); 
} 

[HttpPost] 
public ActionResult Create(RecipeCreateViewModel recipe) { 
    if (ModelState.IsValid) { 
     // set the course name based on the id that was posted 
      // not currently checking if the repository doesn't find anything. 
    recipe.CourseName = courseRepository.Find(recipe.CourseId).Name; 
      var recipeEntity = Mapper.Map<RecipeCreateViewModel, Recipe>(recipe); 
     recipeRepository.InsertOrUpdate(recipeEntity); 
     recipeRepository.Save(); 
     return RedirectToAction("Index"); 
    } else { 
     recipe.CourseList = new SelectList(courseRepository.All, "Id", "Name"); 
     return View(recipe); 
    } 
} 

Antwort

3

Wenn Sie die 'natürliche' (sehr subjektiv) folgen fließen, es ist wie dieses

Um erstellenDomain Modell

Ansichtsmodell -> Mapper -> Domain Entity -> Repository -> Mapper -> Persistenz Entität

Zu Anzeige die Update Ansicht Modell

Persistence Entity -> Mapper -> Ansichtsmodell

In der ersten Situation Sie eine dto in eine Domäne Einheit verarbeiten (anwenden Geschäftsregeln usw.), dann schicken Sie es in das Repository, wo es auf eine bestimmte Art und Weise beibehalten wird (EF-Entitäten)

In der zweiten Situation möchten Sie ein Ansichtsmodell (ein DTO) laden, das zum Aktualisieren des Domänenmodells verwendet wird. Anstatt die gesamte Domain-Entity neu zu laden und sie dann dem DTO zuzuordnen, tun Sie dies direkt aus dem Repository.

Sie werden wahrscheinlich sagen, dass diese Fälle nicht auf Sie zutreffen, da Sie direkt gegen EF arbeiten. Nun, das ist der Trick, das Domänenmodell! = Persistenzmodell! = Modell anzeigen. Sie sind alle unterschiedlich und haben unterschiedliche Anliegen.

Also, mit dem richtigen Trennung haben Sie immer: Ansichtsmodell -> Karte -> Domain Entity -> Karte -> persistnence Einheit und in entgegengesetzter Richtung: Persistenz Einheit -> Karte -> Ansicht Modell

+0

Vielen Dank für Die Antwort Mike, meine Frage war nicht sehr klar, da ich mich über einige Dinge nicht sicher bin und mehrere Dinge auf einmal anfordere .. ich schließe das ab und Sie haben eine schöne klare Vorstellung von den Erstellungs- und Anzeigeebenen gegeben. Das Problem, mit dem ich zu kämpfen hatte, war das Mapping zurück vom Viewmodel. – Pricey

+0

@MikeSW Warum überspringen Sie das Domänenmodell bei der Konvertierung zurück von PM zu VM? Ist es nicht besser, Ihre VM von DM aus zuzuordnen? Auf diese Weise machst du es nur einmal in deiner oberen Schicht. –

+0

@ JoaoLeme Es ist nicht. Das Anzeigen des Modells der Update-Ansicht erfordert nur gespeicherte Daten aus dem Modell, das bereits von der Persistenz-Entität verfügbar ist. Anstatt also das gesamte Objekt zu füllen, frage ich direkt den Speicher ab, um die relevanten Daten zu erhalten. Es ist ziemlich viel CQRS – MikeSW