AutoMapper vs ValueInjecter

Chaque fois que je recherche des choses sur AutoMapper sur StackOverflow, je lis quelque chose sur ValueInjecter .

Quelqu’un peut-il me dire le pour et le contre (performance, fonctionnalités, utilisation de l’API, extensibilité, tests)?

En tant que créateur de ValueInjecter , je peux vous dire que je l’ai fait parce que je voulais quelque chose de simple et de très flexible

Je n’aime vraiment pas trop écrire ou écrire beaucoup de monkey code de monkey code comme:

 Prop1.Ignore, Prop2.Ignore etc. CreateMap(); CreateMap(); etc. 

ValueInjecter est quelque chose comme mozilla avec ses plugins, vous créez ValueInjections et vous les utilisez

il y a des injections intégrées pour aplatir, dénaturer et certaines sont destinées à être héritées

et cela fonctionne plus dans un type d’aspect , vous n’avez pas besoin de spécifier toutes les propriétés 1 à 1, mais vous faites quelque chose comme:

prendre toutes les propriétés int de la source dont le nom se termine par “Id”, transformer la valeur et définir chacune sur une propriété dans l’object source avec le même nom sans le suffixe Id et son type est hérité de Entity, des choses comme ça

Donc, une différence évidente, ValueInjecter est utilisé même dans les formulaires Windows avec aplatissement et dénaturation, c’est la flexibilité qu’il est

(mappage d’object pour former des contrôles et retour)

Automapper, non utilisable dans les formulaires Windows, pas flatteur, mais il a de bonnes choses comme le mappage de collections, donc si vous en avez besoin avec ValueInjecter, vous faites juste quelque chose comme:

foos.Select(o => new Bar().InjectFrom(o));

vous pouvez également utiliser ValueInjecter pour mapper des objects anonymes et dynamics

différences:

  • automapper crée une configuration pour chaque possibilité de mappage CreateMap ()

  • valueinjecter injecte de n’importe quel object à n’importe quel object (il y a aussi des cas où vous injectez de l’object au type de valeur)

  • automapper a l’aplatissement construit, et seulement pour les types simples ou du même type, et il n’a pas unflattening

  • valueinjecter uniquement si vous en avez besoin target.InjectFrom(source); also target.InjectFrom(source); also et si vous voulez de Foo.Bar.Name of type Ssortingng à FooBarName of type Class1 vous héritez de FlatLoopValueInjection et vous spécifiez ceci

  • automapper mappe les propriétés avec le même nom par défaut et pour le rest, vous devez spécifier une par une et faire des choses comme Prop1.Ignore (), Prop2.Ignore () etc.

  • valueinjecter a une injection par défaut .InjectFrom () qui effectue les propriétés avec le même nom et le même type; pour tout le rest, vous créez vos injections de valeur personnalisées avec une logique / des règles de mappage individuelles, des aspects similaires, par exemple de tous les accessoires de Type Foo à tous les accessoires de type Bar

Comme je n’ai jamais utilisé aucun des autres outils, je ne peux parler que d’AutoMapper. J’avais quelques objectives en tête pour créer AutoMapper:

  • Soutenir l’aplatissement des objects DTO muets
  • Support des scénarios évidents (collections, énumérations, etc.)
  • Être capable de vérifier facilement les correspondances dans un test
  • Autoriser les cas d’arête pour résoudre des valeurs provenant d’autres endroits (mappage de type-> type personnalisé, mappage de membre individuel et certains cas extrêmes).

Si vous voulez faire ces choses, AutoMapper fonctionne très bien pour vous. Les choses ne vont pas bien avec AutoMapper:

  • Remplir des objects existants
  • Dégoûtant

La raison en est que je n’ai jamais eu besoin de faire ces choses. Pour la plupart, nos entités n’ont pas d’agents de détermination, n’exposent pas de collections, etc. Nous utilisons AutoMapper pour aplatir les fichiers DTO et pour les mapper des modèles d’interface utilisateur aux messages de commande, etc. C’est là que ça marche vraiment, vraiment bien pour nous.

J’ai essayé les deux et je préfère ValueInjecter parce que c’est si simple:

 myObject.InjectFrom(otherObject); 

C’est tout ce qu’il y a à savoir pour la grande majorité de mes besoins d’injection. Il ne peut pas être plus simple et élégant que cela.

C’est une question sur laquelle j’ai fait des recherches, et pour mon cas d’utilisation, il semble que ce soit de l’injecteur de valeur. Il ne nécessite aucune configuration préalable (peut-être que les performances peuvent atteindre les performances, bien que si elles étaient intelligemment mises en œuvre, elles pourraient mettre en cache les futurs invocations plutôt que de les refléter à chaque fois).

Plus important encore, il permet la cartographie inverse. Maintenant, il se peut que je manque quelque chose ici car Jimmy mentionne qu’il ne voit aucun cas d’utilisation où c’est nécessaire, alors peut-être que le modèle est faux, mais mon cas d’utilisation est que je crée un object ViewModel à partir de mon ORM. Je l’affiche ensuite sur ma page Web. Une fois que l’utilisateur a terminé, j’obtiens le ViewModel en tant que httppost, comment cela est-il reconverti en classes ORM d’origine? J’aimerais connaître le modèle avec automapper. Avec ValueInjector, c’est sortingvial et il sera même peu flatteur. p.ex. créer une nouvelle entité

Le modèle créé par entityframework (modèle en premier):

 public partial class Family { public int Id { get; set; } public ssortingng FamilyName { get; set; } public virtual Address Address { get; set; } } public partial class Address { public int Id { get; set; } public ssortingng Line1 { get; set; } public ssortingng Line2 { get; set; } public ssortingng TownCity { get; set; } public ssortingng County { get; set; } public ssortingng Postcode { get; set; } public virtual Family Family { get; set; } } 

Le ViewModel (que je peux décorer avec des validateurs):

 public class FamilyViewModel { public int Id { get; set; } public ssortingng FamilyName { get; set; } public int AddressId { get; set; } public ssortingng AddressLine1 { get; set; } public ssortingng AddressLine2 { get; set; } public ssortingng AddressTownCity { get; set; } public ssortingng AddressCounty { get; set; } public ssortingng AddressPostcode { get; set; } } 

Le 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(familyViewModel); db.Families.Add(family); db.SaveChanges(); return RedirectToAction("Index"); } catch { return View(); } } 

Pour moi, cela ne devient pas beaucoup plus simple que ça?

(Cela soulève donc la question suivante: qu’est-ce qui ne va pas avec le modèle que j’utilise (et il semble que beaucoup d’autres le fassent), que ce n’est pas perçu comme intéressant pour AutoMapper?)

Cependant, si ce modèle, tel que décrit, est celui que vous souhaitez utiliser, alors mon vote est une valeur d’injecteur pour un mile de pays.