C'est une question que j'ai également recherchée, et pour mon cas d'utilisation, il semble que l'injecteur de valeur soit de loin. Il ne nécessite aucune configuration préalable à utiliser (peut affecter les performances, je suppose, bien que s'il est intelligemment mis en œuvre, il puisse mettre en cache les mappages pour les invocations futures plutôt que de les refléter à chaque fois), vous n'avez donc pas besoin de prédéfinir les mappages avant de les utiliser.
Mais surtout, il permet une cartographie inversée. Maintenant, je manque peut-être quelque chose ici car Jimmy mentionne qu'il ne voit aucun cas d'utilisation là où c'est nécessaire, alors peut-être que le modèle est incorrect, mais mon cas d'utilisation est que je crée un objet ViewModel à partir de mon ORM. Je l'affiche ensuite sur ma page Web. Une fois que l'utilisateur a terminé, je récupère le ViewModel en tant que httppost, comment cela est-il reconverti aux classes ORM d'origine? J'adorerais connaître le modèle avec automapper. Avec ValueInjector, c'est trivial, et il sera même aplati. ex: création d'une nouvelle entité
Le modèle créé par l'entitéframework (modèle d'abord):
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 (que je peux décorer avec des 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, cela ne devient pas beaucoup plus simple que cela?
(Donc, cela soulève la question, qu'est-ce qui ne va pas avec le modèle que je rencontre (et il semble que beaucoup d'autres le fassent), que ce n'est pas considéré comme ayant une valeur pour AutoMapper?)
Cependant, si ce modèle, tel que décrit, est celui que vous souhaitez utiliser, alors mon vote est injecteur de valeur par un mile du pays.