209 votes

AutoMapper vs ValueInjecter

Chaque fois que je cherche des trucs AutoMapper sur StackOverflow, je lis quelque chose à propos de ValueInjecter .

Quelqu'un peut-il me dire les avantages et les inconvénients entre eux (performance, fonctionnalités, utilisation de l'API, extensibilité, test)?

170voto

Omu Points 17372

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 très flexible

Je n'aime vraiment pas écrit beaucoup ou écrit beaucoup de monkey code comme:

Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.

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

il y a intégré des injections d'aplatissement, unflattening, et certains qui sont destinés à être héréditaire

et il travaille plus dans un aspect type de voie, vous n'avez pas à spécifier toutes les propriétés 1 à 1, au lieu de vous faire quelque chose comme:

prendre toutes les int des propriétés de la source dont le nom se termine par "Id", faire de la valeur et de définir chacune à une propriété de l'objet source avec le même nom sans le suffixe de l'Id et il est de type hérité de l'Entité, des trucs comme ça

donc une différence évidente, ValueInjecter est même utilisé dans les windows forms avec l'aplatissement et de unflattening, c'est la façon flexible, il est

(cartographie de l'objet de contrôles de formulaire et à l'arrière)

Automapper pas utilisable dans les windows forms, pas de unflatenning, mais il a des bonnes choses comme des collections de la cartographie, de sorte que dans le cas où vous en avez besoin avec ValueInjecter que vous venez de faire quelque chose comme:

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

vous pouvez également utiliser ValueInjecter à la carte à partir de anonyme et dynamique des objets

différences:

  • automapper créer une configuration pour chaque cartographie possibilité CreateMap()

  • valueinjecter injecter à partir de n'importe quel objet de n'importe quel objet (il y a aussi des cas lorsque vous injectez de l'objet à valuetype)

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

  • valueinjecter seulement si vous en avez besoin, vous n' target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection> et si vous voulez à partir d' Foo.Bar.Name of type String de FooBarName of type Class1 vous héritez FlatLoopValueInjection et de préciser ce

  • automapper cartes propriétés de même nom par défaut et pour le reste, vous devez spécifier un par un, et faire des trucs comme Prop1.Ignore(), Prop2.Ignore() etc.

  • valueinjecter a un défaut d'injection .InjectFrom() qui fait la propriétés avec le même nom et de même type; pour tout le reste, vous créez votre propre valueinjections individuelle avec la cartographie de la logique et des règles, de plus en plus des aspects, par exemple, à partir de tous les accessoires de Type Foo à tous les accessoires de type Barre

59voto

Jimmy Bogard Points 8294

Depuis je n'ai jamais utilisé l'un de l'autre des outils, je ne peux que parler de AutoMapper. J'ai eu quelques objectifs en tête pour la construction de AutoMapper:

  • Le soutien de l'aplatissement de muets DTO objets
  • Soutien évident des scénarios de sortie de la boîte (les collections, les énumérations, etc.)
  • Être en mesure de vérifier facilement les mappages dans un test
  • Autoriser pour les cas limites pour la résolution des valeurs à partir d'autres endroits (type personnalisé->type de cartographie, membre individuel de la cartographie, et certains vraiment fou bord des cas).

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

  • Le remplissage des objets existants
  • Unflattening

La raison étant que je n'ai jamais eu besoin de faire ces choses. Pour la plupart, de nos entités n'ont pas de poseurs, de ne pas exposer les collections, etc. c'est pourquoi il n'est pas là. Nous utilisons AutoMapper pour aplatir à des Otd et carte à partir de l'INTERFACE utilisateur des modèles de messages de commande et la comme. C'est là que cela fonctionne vraiment, vraiment bien pour nous.

55voto

Adrian Grigore Points 15993

J’ai essayé les deux et le préfèrent ValueInjecter car il est si simple :

C’est tout ce qu’il faut savoir pour la grande majorité de mes besoins d’injection. Éventuellement, vous ne retrouvez plus simple et plus élégant que cela.

27voto

DanH Points 1702

C'est une question que j'ai fait des recherches aussi, et pour mon cas d'utilisation, il semble être valueinjecter mains vers le bas. Il ne nécessite aucune configuration précédente à utiliser (peut frapper la performance, je suppose, même si intelligemment mis en œuvre, il peut mettre en cache les mappages pour les futurs appels plutôt que de réfléchir à chaque fois), de sorte que vous n'avez pas besoin de saisir tous les mappages avant de les utiliser.

Mais le plus important, il permet de cartographie inverse. Maintenant j'ai peut-être raté quelque chose ici comme Jimmy mentionne qu'il ne voit pas de cas d'utilisation où il est nécessaire, donc j'ai peut-être le modèle de mal, mais mon cas est que je suis de la création d'un ViewModel objet de mon ORM. Je puis les affiche sur ma page web. Une fois que l'utilisateur a terminé l'-je obtenir le ViewModel de retour en tant que httppost, comment cela est-il converti à l'origine de l'ORM classes? J'aimerais savoir le modèle avec automapper. Avec ValueInjector il est trivial, et il sera même unflatten. e.g la Création d'une nouvelle entité

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

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; }
}

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

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; }
}

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

À mon avis, il ne va pas beaucoup plus simple que cela?

(Si cela soulève la question, quoi de mal avec le modèle que j'ai exécuté ce (et il semble que beaucoup d'autres), que ce n'est pas considéré comme de valeur à AutoMapper?)

Toutefois, si cette tendance comme decscribed, est celui que vous souhaitez utiliser, puis mon vote est valueinjecter dans un pays lointain.

9voto

Danny Varod Points 8685

Je viens de vérifier sur ValueInjecter, suite à cette question...

J’aime cette façon permet un mappage aisé des valeurs dans un objet existant.
(bon pour les objets de destination dépendant du contexte).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X