2016-07-05 24 views
3

Ich arbeite an einem Projekt, das mit AutoMapper eingerichtet wurde. Da mir das meiste fremd ist, bin ich offen dafür, warum.Mapper vs Konstruktor

Sagen wir, ich habe zwei Klassen:

class Foo 
{ 
    public string name { get; set; } 
    public int rank { get; set; } 
    public bool isDelected { get; set; } 
} 

class FooView 
{ 
    public string name { get; set; } 
    public int rank { get; set; } 
} 

stattdessen ein ORM verwenden, warum sollte ich nicht einfach einen Konstruktor verwenden, die FooView als Parameter annimmt.

class Foo 
{ 
    public Foo(FooView source) 
    { 
     this.name = source.name; 
     this.rank = source.rank; 
    } 
} 

In diesem Fall, wenn ich eine FooView haben und ich brauche Foo Ich sage nur

var myFoo = new Foo(FooView); 

Es gib mir die ganze Logik, die ich in einem Ort brauchen, und ich kann es überall benutzen. Wenn ich den Code aktualisieren muss, ist es der gleiche Ort wie die Modelldefinition. Also was fehlt mir?

+1

Sie dies tun können, aber was ist, wenn Sie 20, 30 oder mehr Eigenschaften haben? Automapper wird diese automatisch zuordnen, wenn die Namen übereinstimmen. Das allein ist jeden Konfigurationsaufwand wert. –

+1

Sie sollten sich über die Vorteile von [Automapper] (http://automapper.org/) informieren und dann selbst entscheiden, ob Sie es verwenden möchten oder nicht. Eine (* es gibt viel mehr Funktionalität als nur dieses *) der Vorteile von Auto-Mapper ist, dass es automatisch Werte über 2 Objekte zuordnen kann, wenn die Eigenschaften die exakt gleiche Signatur haben (beide müssen auch öffentlichen Setter/Getter haben). Dies könnte derselbe Typ (wie ein Klon) oder von verschiedenen Typen sein. Dies könnte viel Code sparen, besonders wenn es viele Ansichtsmodelle gibt, die den Geschäftslogikmodellen sehr ähnlich sind. – Igor

+1

Ich denke wie @MattyM wies darauf hin, dass dies eine große Verbesserung auch Test-Fähigkeit und Konsistenz. Einer der ersten Punkte in der 'AutoMapper'-Dokumentation erklärt, warum man es benutzt :) –

Antwort

1

Dies kann in Ordnung sein, wenn sich alle Modelle in derselben Baugruppe befinden oder direkt von den anderen Elementen abhängig sind. AutoMapper eignet sich hervorragend, wenn Ihre Modelle gut ausgerichtet sind. Wenn Sie jedoch etwas mehr Kontrolle über das Mapping benötigen, tendiere ich dazu, diese in einer statischen Mapping-Methode in einem dedizierten Hilfsprogramm oder im MVC-Controller zu verwenden.

Dies hilft, meine Abbildungslogik getrennt von den Modellen

private static Foo MapToFoo(FooView vm) 
{ 
    var foo = new Foo(); 
    foo.Name = vm.Name; 
    foo.Rank = vm.Rank; 
    ... 
    return foo; 
}