2014-06-10 14 views
10

Derzeit verwende ich private statische Methoden in meiner Controller-Datei, um das Domänenmodell dem Modell zuzuordnen und umgekehrt. Wie unten:Wo sollte ich mein Domänenmodell platzieren, um Modellzuordnungscode anzuzeigen?

public ActionResult Details(int personID) 
{ 
    Person personDM = service.Get(personID); 
    PersonViewModel personVM = MapDmToVm(personDM); 
    return View(personVM); 
} 

private static PersonViewModel MapDmToVm(Person dm) 
{ 
    PersonViewModel vm; 
    // Map to VM 
    return vm; 
} 

Gibt es einen anderen Standard Weg, dies zu tun?

+1

Sie könnten meine Antwort [hier] (http://stackoverflow.com/questions/14131804/view-models-and-dependency-injection/14132184#14132184) nützlich finden. –

Antwort

19

Ich bevorzuge es, die Mapping-Logik in die Klasse View-Modell (dto) zu setzen, weil wir das Domain-Modell so sauber wie möglich halten wollen und auch das Domain-Modell könnte sich über die Zeit ändern.

public class Person 
{ 
    public string Name {get; set;} 
} 

public class PersonViewModel 
{ 
    public string Text {get; set;} 

    public static implicit operator PersonViewModel(Person dm) 
    { 
     var vm = new PersonViewModel { Text = dm.Name }; 
     return vm; 
    } 

    public static implicit operator Person(PersonViewModel vm) 
    { 
     var dm = new Person { Name = vm.Text }; 
     return dm; 
    } 
} 

und verwenden Sie es in der Steuerung ohne explizite Casting.

Person dm = service.Get(id); 
PersonViewModel vm = dm; 
+0

Ich bevorzuge das auch persönlich und argumentiere, dass das ViewModel bereits "weiß", wie man das Modell so darstellt, dass es zur Ansicht passt, also auch das "Wissen", wie man zwischen den beiden Darstellungen mappt. – chiccodoro

+0

@chiccodoro stimmen zu, normalerweise befinden sich das Ansichtsmodell (dto) im UI-Projekt und das Domänenmodell im Serverprojekt und das UI-Projekt fügt einen Verweis auf das Serverprojekt hinzu. –

+7

Einzige Sache, ich würde persönlich implizite Operatoren ausbleiben, da sie etwas Verwirrung darüber bringen können, ob ein bestimmtes Stück Code auf dem Domänenmodell oder dem Ansichtsmodell operiert. Ich habe stattdessen zwei Methoden 'FromModel',' ToModel' definiert. – chiccodoro

3

Da die Zuordnung nicht immer trivial ist, denke ich, dass es vielleicht besser wäre, es in eine andere Klasse als die anderen Ansichtsmodell zu trennen.

So hat jede Klasse ihre eigene Verantwortung. Vielleicht möchten Sie eine Erweiterungsmethode zu Ihrem Domain-Modell, so etwas wie hinzufügen:

public static MyViewModel ToViewModel(this MyDomainModel model) 
    { 
     // mapping code goes here 
    } 

Sie auch interessieren könnten AutoMapper verwenden und seine Map-Methode aus dem Controller aufrufen.

Verwandte Themen