Jedes Mal, wenn ich auf StackOverflow nach AutoMapper-Inhalten suche, lese ich etwas über ValueInjecter .
Kann mir jemand die Vor- und Nachteile zwischen ihnen erklären (Leistung, Funktionen, API-Nutzung, Erweiterbarkeit, Tests)?
Jedes Mal, wenn ich auf StackOverflow nach AutoMapper-Inhalten suche, lese ich etwas über ValueInjecter .
Kann mir jemand die Vor- und Nachteile zwischen ihnen erklären (Leistung, Funktionen, API-Nutzung, Erweiterbarkeit, Tests)?
Antworten:
Als Schöpfer von ValueInjecter kann ich Ihnen sagen, dass ich es getan habe, weil ich etwas Einfaches und sehr Flexibles wollte
Ich schreibe wirklich nicht viel oder schreibe viel monkey code
wie:
Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.
ValueInjecter ist so etwas wie Mozilla mit seinen Plugins. Sie erstellen ValueInjections und verwenden sie
Es gibt integrierte Injektionen zum Abflachen, Abflachen und einige, die vererbt werden sollen
und es funktioniert mehr in einer Art Aspekt , Sie müssen nicht alle Eigenschaften 1-zu-1 angeben, sondern Sie tun etwas wie:
Nehmen Sie alle int-Eigenschaften aus der Quelle, deren Name mit "Id" endet, transformieren Sie den Wert und setzen Sie jede auf eine Eigenschaft im Quellobjekt mit demselben Namen ohne das ID-Suffix, und der Typ wird von Entity geerbt
Ein offensichtlicher Unterschied ist, dass ValueInjecter auch in Windows-Formularen mit Abflachung und Abflachung verwendet wird. So flexibel ist es
(Zuordnung von Objekt zu Formularsteuerelementen und zurück)
Automapper, nicht in Windows-Formularen verwendbar, kein Unflatenning, aber es gibt gute Dinge wie das Zuordnen von Sammlungen. Wenn Sie es also mit ValueInjecter benötigen, tun Sie einfach Folgendes:
foos.Select(o => new Bar().InjectFrom(o));
Sie können ValueInjecter auch verwenden, um anonyme und dynamische Objekte zuzuordnen
Unterschiede:
Automapper erstellen Konfiguration für jede Mapping-Möglichkeit CreateMap ()
valueeinjecter injiziert von einem Objekt zu einem beliebigen Objekt (es gibt auch Fälle, in denen Sie von einem Objekt zu einem Werttyp injizieren)
Automapper hat es abgeflacht, und zwar nur für einfache Typen oder vom selben Typ, und es hat keine Abflachung
valueeinjecter nur dann, wenn Sie es brauchen target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
und wenn Sie möchten Foo.Bar.Name of type String
, FooBarName of type Class1
erben Sie FlatLoopValueInjection und geben Sie dies an
Automapper ordnet standardmäßig Eigenschaften mit demselben Namen zu. Im Übrigen müssen Sie eine nach der anderen angeben und Dinge wie Prop1.Ignore (), Prop2.Ignore () usw. ausführen.
valueeinjecter hat eine Standardinjektion .InjectFrom (), die die Eigenschaften mit demselben Namen und Typ ausführt. Für alles andere erstellen Sie Ihre benutzerdefinierten Wertinjektionen mit individuellen Zuordnungslogiken / -regeln, die eher Aspekten ähneln, z. B. von allen Requisiten vom Typ Foo bis zu allen Requisiten vom Typ Bar
<pedant>
Sieht cool aus, aber vielleicht sollte es ValueInjectOr sein? </pedant>
Da ich noch nie eines der anderen Tools verwendet habe, kann ich nur über AutoMapper sprechen. Ich hatte ein paar Ziele vor Augen, um AutoMapper zu erstellen:
Wenn Sie diese Dinge tun möchten, funktioniert AutoMapper sehr gut für Sie. Dinge, die AutoMapper nicht gut macht, sind:
Der Grund dafür ist, dass ich diese Dinge nie tun musste. Zum größten Teil haben unsere Entitäten keine Setter, machen keine Sammlungen verfügbar usw. Deshalb ist es nicht da. Wir verwenden AutoMapper, um DTOs zu reduzieren und von UI-Modellen Befehlsnachrichten und dergleichen zuzuordnen. Dort funktioniert es wirklich sehr, sehr gut für uns.
Ich habe beides ausprobiert und bevorzuge ValueInjecter, weil es so einfach ist:
myObject.InjectFrom(otherObject);
Das ist alles, was ich für die überwiegende Mehrheit meiner Injektionsbedürfnisse wissen muss. Einfacher und eleganter geht es nicht.
this object
Erweiterungsmethode dort?
InjectFrom()
Erweiterungsmethode selbst zu implementieren .
Dies ist eine Frage, die ich auch untersucht habe, und für meinen Anwendungsfall scheint es zweifellos ein Wertinjektor zu sein. Die Verwendung erfordert keine vorherige Einrichtung (kann die Leistung beeinträchtigen, obwohl sie bei intelligenter Implementierung die Zuordnungen für zukünftige Aufrufe zwischenspeichern könnte, anstatt sie jedes Mal wiederzugeben), sodass Sie vor der Verwendung keine Zuordnungen vordefinieren müssen.
Am wichtigsten ist jedoch, dass es eine umgekehrte Zuordnung ermöglicht. Jetzt fehlt mir hier möglicherweise etwas, da Jimmy erwähnt, dass er keinen Anwendungsfall sieht, wo dies erforderlich ist. Vielleicht habe ich das falsche Muster, aber mein Anwendungsfall ist, dass ich ein ViewModel-Objekt aus meinem ORM erstelle. Ich zeige dies dann auf meiner Webseite an. Wenn der Benutzer fertig ist, erhalte ich das ViewModel wieder als httppost. Wie wird es wieder in die ursprünglichen ORM-Klassen konvertiert? Ich würde gerne das Muster mit Automapper kennen. Mit ValueInjector ist es trivial und wird sogar abgeflacht. zB Erstellen einer neuen Entität
Das vom Entityframework erstellte Modell (Modell zuerst):
public partial class Family
{
public int Id { get; set; }
public string FamilyName { get; set; }
public virtual Address Address { get; set; }
}
public partial class Address
{
public int Id { get; set; }
public string Line1 { get; set; }
public string Line2 { get; set; }
public string TownCity { get; set; }
public string County { get; set; }
public string Postcode { get; set; }
public virtual Family Family { get; set; }
}
Das ViewModel (das ich mit Validatoren dekorieren kann):
public class FamilyViewModel
{
public int Id { get; set; }
public string FamilyName { get; set; }
public int AddressId { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string AddressTownCity { get; set; }
public string AddressCounty { get; set; }
public string AddressPostcode { get; set; }
}
Der ViewController:
//
// GET: /Family/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Family/Create
[HttpPost]
public ActionResult Create(FamilyViewModel familyViewModel)
{
try
{
Family family = new Family();
family.InjectFrom<UnflatLoopValueInjection>(familyViewModel);
db.Families.Add(family);
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Einfacher geht es meiner Meinung nach nicht?
(Das wirft also die Frage auf, was ist falsch an dem Muster, auf das ich stoße (und es scheint, dass viele andere dies tun), dass es für AutoMapper nicht als wertvoll angesehen wird?)
Wenn Sie dieses Muster jedoch als beschrieben verwenden möchten, ist meine Stimme ein Wert für eine Landmeile.