2016-08-19 3 views
1

Ich muss etwas zwischen Objekten (z. B. PersonModel zu PersonViewModel) kartieren und erforsche die verschiedenen Ansätze dazu. Insbesondere arbeite ich mit Entity Framework und versuche, die generierten Modelle einem Viewmodel zuzuordnen.Was sind die verschiedenen Ansätze zum Object-Object-Mapping in .NET?

Ich habe jedoch noch einen Artikel oder eine Ressource zu finden, die eine Liste zusammenstellt, wie Sie dies tun können. Bisher habe ich über die kommen folgende:

  • Implicit Conversion (Ich denke, das die einfachste Ansatz ist, da Sie manuell Karte Eigenschaften von einem Objekt zum anderen, seine einfache, aber langweilig?)
  • Erweiterungsmethoden (nicht mit diesem noch gearbeitet)
  • Reflection (ich habe ein bisschen gebastelt, schaffte es aber nur sehr grundlegende Mapping)
  • AutoMapper (sehr beliebt, aber ich habe Probleme, die es gut mit EF)
  • Value Injecter (habe noch nicht damit gearbeitet)
  • Emit Mapper (nicht mit diesem noch gearbeitet, aber wahrscheinlich hätte ich Probleme damit es mit EF arbeiten?)

Können Sie bitte auf die Ansätze dort zur Verfügung weisen und erarbeiten helfen, sowie Profis/Nachteile von jedem? Zum Beispiel sah ich, dass Automapper langsam ist, verglichen mit manuellem Mapping. Oder vielleicht, weisen Sie auf einen Artikel hin, der das angeht?

EDIT: da einige fragen, welches Problem ich mit AutoMapper haben, sehen Sie bitte dieses: Automapper: How to map IList to EntityCollection

+0

Du fragst nach einem ganzen Artikel oder gar einem Buchkapitel. SO ist eine Q & A-Site. Und Automapper hat keine Probleme mit EF zu arbeiten, hauptsächlich weil Objekte, die von EF zurückgegeben werden, einfache alte Objekte sind. Wenn Sie EF-spezifische Klassen wie 'EntityCollection' verwenden, machen Sie es falsch. Überprüfen Sie alle Tutorials und Sie werden sehen, dass sie die einfachste 'ICollection verwenden ' –

Antwort

2

Nun, ich kann Ihnen eine Möglichkeit geben, wo Sie Ihre eigene Mapping tun, ziemlich einfach zu tun und schnell ausgeführt werden können über eine große Menge an Daten. Ich werde Ihnen zeigen, was ich tun würde, und dann versuchen, näher auszuführen, warum ich das mache, was ich tue. Hier geht:

public class PersonViewModel 
{ 
    public static Expression<Func<Person, PersonViewModel>> FromPerson 
    { 
     get 
     { 
      return p => new PersonViewModel 
      { 
       Name = p.FirstName, 
       SurName = p.LastName 
      }; 
     } 
    } 

    public string Name { get; set; } 
    public string SurName { get; set; } 
    public static PersonViewModel CreateViewModel(Person original) 
    { 
     var func = FromPerson.Compile(); 
     var vm = func(original); 

     return vm; 
    } 
} 

Jetzt werden Sie feststellen, dass ich zwei Möglichkeiten, von einer Person EF-Modell in Ansichtsmodell zu konvertieren. Dies liegt daran, dass die erste, die den Ausdruck> verwendet, zum Konvertieren einer großen Menge von Objekten in einer Select() -Anweisung verwendet wird. Einfache Nutzung:

return people.Select(PersonViewModel.FromPerson); 

In diesem Fall haben wir abgerufen wahrscheinlich eine Sammlung von Person-Objekte aus der DB und müssen ihnen zeigen, sagen wir, in einer Liste oder etwas, aber mit dem Ansichtsmodell. Auf diese Weise wird die Operation in großen Mengen ausgeführt und ist viel schneller als einfach alle Objekte über die andere Methode zu erstellen. Jetzt kann die statische CreateViewModel-Methode verwendet werden, um ein einzelnes Objekt dort abzubilden, wo es benötigt wird. Ein Beispiel ist, wenn Sie die Daten eines einzelnen Benutzers aus der DB erhalten haben und diese anzeigen müssen, aber mit Ihrem ViewModel. In diesem Fall wäre es angemessen, anstelle des Ausdrucks, der hauptsächlich für Massenkonvertierungen gedacht ist, die statische Methode zu verwenden.

Das ist, was ich bieten kann, abgesehen von Fragen, was falsch mit der Verwendung von AutoMapper ist, da es ziemlich einfach ist, und Sie haben nicht wirklich auf das Problem mit der Verwendung neben EF ausgearbeitet. Hoffe das hilft dir wenigstens ein bisschen in deinem Problem :)

+0

Ich würde vorschlagen, dass 'CreateViewModel' 'FromPerson' verwenden würde, um Code-Duplizierung zu reduzieren.Fast jedes reale Mapping hätte wesentlich mehr Eigenschaften. Daher wäre die Anwendung des DRY-Prinzips (Do not Repeat Yourself) sinnvoll. – Phil1970

+0

Ah, du hast recht, ich habe es vergessen, seit ich es im laufenden Betrieb geschrieben habe, danke für die Korrektur, werde ich es beheben. –

Verwandte Themen