¿Es posible asignar múltiples objetos DTO a un único ViewModel usando Automapper?

Me preguntaba si es posible asignar múltiples objetos DTO a un solo objeto ViewModel usando Automapper?

Esencialmente, tengo varios objetos DTO y me gustaría mostrar información de cada uno en una sola pantalla en ASP.NET MVC 2.0. Para ello me gustaría aplanar los objetos DTO (o partes de ellos …) en el modelo de visualización y pasar dicho modelo a la vista. Si tuviera un DTO, esto sería fácil, pero nunca he visto que se haga con múltiples. Obviamente, hay varias formas indirectas de hacer esto (fuera de automapper), pero este es el enfoque que me gustaría tomar si es posible.

Podría crear un DTO compuesto que contenga dos o más objetos DTO y asignar el DTO compuesto al modelo de vista de salida.

Si tiene 2 clases de DTO y 1 modelo de vista aplanada:

public class Dto1 { public string Property1 { get; set; } } public class Dto2 { public string Property2 { get; set; } } public class FlattenedViewModel { public string Property1 { get; set; } public string Property2 { get; set; } } 

Y creas asignaciones para ambos DTO para ver el modelo:

 CreateMap(); CreateMap(); 

Puede asignar 1st DTO al modelo y luego simplemente “agregar” 2nd DTO:

 var dto1 = new Dto1 { Property1 = "Value1"; } var dto2 = new Dto2 { Property2 = "Value2"; } var model = Mapper.Map(dto1); // map dto1 properties Mapper.Map(dto2, model); // append dto2 properties 

Puede agregar un método de extensión de anulación de mapa fuera de IMappingEngine que toma una matriz params. Algo como:

 public static class AutoMapperExtensions { public static T Map(this IMappingEngine engine, params object[] sources) where T : class { if (sources == null || sources.Length == 0) return default(T); var destinationType = typeof (T); var result = engine.Map(sources[0], sources[0].GetType(), destinationType) as T; for (int i = 1; i < sources.Length; i++) { engine.Map(sources[i], result, sources[i].GetType(), destinationType); } return result; } } 

Entonces podrías llamarlo así:

 var result = Mapper.Engine.Map(dto1, dto2, dto3); 

Acabo de hacer esto yo mismo y tengo una gran solución. Es muy probable que sus dos vistas estén realmente relacionadas de alguna manera en su sistema (especialmente si está utilizando Entity Framework). Revise sus modelos y debería ver algo que muestre la relación, si no lo hace, simplemente agréguelo. (El virtual )

Tus modelos

  public class Dto1 { public int id { get; set; } public string Property2 { get; set; } public string Property3 { get; set; } public string Property4 { get; set; } public string Property5 { get; set; } public virtual Dto2 dto2{ get; set; } } public class Dto2 { public int id { get; set; } public string PropertyB { get; set; } public string PropertyC { get; set; } public string PropertyD { get; set; } public string PropertyE { get; set; } } 

Tus modelos de vista

  public class Dto1ViewModel { public string Property1 { get; set; } public string Property2 { get; set; } public virtual Dto2VMForDto1 dto2{ get; set; } } //Special ViewModel just for sliding into the above public class Dto2VMForDto1 { public int id { get; set; } public string PropertyB { get; set; } public string PropertyC { get; set; } } 

Automapper se ve así:

  cfg.CreateMap< Dto1, Dto1ViewModel>(); cfg.CreateMap< Dto2, Dto2VMForDto1 >(); 

Supongo que está obteniendo sus datos con LinQ:

 Dto1ViewModel thePageVM = (from entry in context.Dto1 where...).ProjectTo(); 

Viola, todo funcionará. En su vista solo acceda usando model.dto2.PropertyB