AutoMapper vs ValueInjecter

Cada vez que busco cosas de AutoMapper en StackOverflow, estoy leyendo algo sobre ValueInjecter .

¿Puede alguien decirme los pros y los contras entre ellos (rendimiento, características, uso de API, extensibilidad, pruebas)?

como creador de ValueInjecter , puedo decirte que lo hice porque quería algo simple y muy flexible

Realmente no me gusta escribir mucho o escribir muchos monkey code de monkey code como:

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

ValueInjecter es algo así como mozilla con sus complementos, usted crea ValueInjections y los usa

hay inyecciones incorporadas para aplanamiento, falta de ajuste y algunas que están destinadas a ser heredadas

y funciona más en un tipo de aspecto de manera , no tiene que especificar todas las propiedades de 1 a 1, en su lugar, hace algo como:

tomar todas las propiedades int de la fuente cuyo nombre termina con “Id”, transformar el valor y establecer cada una en una propiedad en el objeto fuente con el mismo nombre sin el sufijo Id y su tipo se hereda de Entity, cosas así

así que una diferencia obvia, ValueInjecter se usa incluso en formularios Windows con aplanamiento y falta de ajuste, así de flexible es

(mapeo de objetos a controles de forma y viceversa)

Automapper, no se puede usar en las formas de Windows, no se desvanece, pero tiene cosas buenas como el mapeo de colecciones, así que en caso de que lo necesites con ValueInjecter solo debes hacer algo como:

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

también puede usar ValueInjecter para mapear desde objetos anónimos y dynamics

diferencias:

  • Automapper crea la configuración para cada posibilidad de mapeo CreateMap ()

  • valueinjecter inyectar desde cualquier objeto a cualquier objeto (también hay casos cuando se inyecta desde objeto a valuetype)

  • Automapper lo ha construido, solo para tipos simples o del mismo tipo, y no tiene unflattening

  • valueinjecter solo si lo necesita, lo hace target.InjectFrom(source); also target.InjectFrom(source); also y si quiere de Foo.Bar.Name of type String a FooBarName of type Class1 hereda FlatLoopValueInjection y especifica esto

  • Automapper asigna propiedades con el mismo nombre de forma predeterminada y para el rest debe especificarlas una a una, y hacer cosas como Prop1.Ignore (), Prop2.Ignore (), etc.

  • valueinjecter tiene una inyección predeterminada .InjectFrom () que hace las propiedades con el mismo nombre y tipo; para todo lo demás, usted crea sus inyecciones de valor personalizadas con reglas / lógica de mapeo individual, más como aspectos, por ejemplo, desde todos los accesorios de Tipo Foo hasta todos los accesorios de tipo Bar

Como nunca utilicé ninguna de las otras herramientas, solo puedo hablar de AutoMapper. Tenía algunos objectives en mente para construir AutoMapper:

  • Soporte para aplanar objetos tontos DTO
  • Admita escenarios obvios al instante (colecciones, enumeraciones, etc.)
  • Ser capaz de verificar fácilmente las asignaciones en una prueba
  • Permitir casos extremos para la resolución de valores de otros lugares (tipo personalizado-> tipo de mapeo, mapeo de miembros individuales y algunos casos extremos muy locos).

Si desea hacer estas cosas, AutoMapper funciona muy bien para usted. Las cosas que AutoMapper no hace bien son:

  • Llenar objetos existentes
  • Aplastar

La razón es que nunca he necesitado hacer estas cosas. En su mayor parte, nuestras entidades no tienen instaladores, no exponen colecciones, etc. por eso no está allí. Usamos AutoMapper para aplanar a DTOs y mapear desde modelos de UI a comandos de mensajes y similares. Ahí es donde funciona realmente, muy bien para nosotros.

Intenté ambos y prefiero ValueInjecter porque es muy simple:

 myObject.InjectFrom(otherObject); 

Eso es todo lo que hay que saber para la gran mayoría de mis necesidades de inyección. No puede ser más simple y elegante que esto.

Esta es una pregunta que he estado investigando también, y para mi caso de uso, parece ser valueinjecter inductivo. No requiere configuración previa para usar (puede afectar el rendimiento, supongo, aunque si se implementa inteligentemente podría almacenar en caché las asignaciones para futuras invocaciones en lugar de reflejarlas cada vez), por lo que no es necesario predefinir ninguna asignación antes de usarlas.

Lo más importante, sin embargo, permite el mapeo inverso. Ahora me puede estar perdiendo algo aquí ya que Jimmy menciona que no ve caso de uso donde es necesario, así que tal vez tengo el patrón mal, pero mi caso de uso es que estoy creando un objeto ViewModel desde mi ORM. A continuación, mostrar esto en mi página web. Una vez que el usuario finaliza, devuelvo ViewModel como un httppost, ¿cómo se convierte esto de nuevo a las clases originales de ORM? Me encantaría saber el patrón con Automapper. Con ValueInjector es trivial, e incluso se desbloqueará. por ejemplo, crear una nueva entidad

El modelo creado por el entityframework (modelo primero):

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

El ViewModel (que puedo decorar con validadores):

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

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

En mi opinión, ¿no es mucho más simple que eso?

(Entonces, surge la pregunta: ¿qué hay de malo en el patrón que encuentro (y parece que muchos otros lo hacen), que no se considera valioso para AutoMapper?)

Sin embargo, si este patrón como se describe, es uno que desea utilizar, entonces mi voto es valueinjecter por un país milla.