standard net mvc example ejemplos dotnet anexsoft c# automapper automapper-2

net - mapping profile c#



Mapeo de una clase de origen a mĂșltiples clases derivadas con automapper (1)

Supongamos que tengo una clase fuente:

public class Source { //Several properties that can be mapped to DerivedBase and its subclasses }

Y algunas clases de destino:

public class DestinationBase { //Several properties } public class DestinationDerived1 : DestinationBase { //Several properties } public class DestinationDerived2 : DestinationBase { //Several properties }

Luego deseo que las clases de destino derivadas hereden la configuración de automapper de la clase base porque no quiero tener que repetirla, ¿hay alguna forma de lograr esto?

Mapper.CreateMap<Source, DestinationBase>() .ForMember(...) // Many more specific configurations that should not have to be repeated for the derived classes .ForMember(...); Mapper.CreateMap<Source, DestinationDerived1 >() .ForMember(...); Mapper.CreateMap<Source, DestinationDerived2 >() .ForMember(...);

Cuando lo escribo así, no usa los mapeos base, e incluir no parece ayudarme.

Editar: Esto es lo que obtengo:

public class Source { public string Test { get; set; } public string Test2 { get; set; } } public class DestinationBase { public string Test3 { get; set; } } public class DestinationDerived1 : DestinationBase { public string Test4 { get; set; } } public class DestinationDerived2 : DestinationBase { public string Test5 { get; set; } }

Mapper.CreateMap<Source, DestinationBase>() .ForMember(d => d.Test3, e => e.MapFrom(s => s.Test)) .Include<Source, DestinationDerived1>() .Include<Source, DestinationDerived2>(); Mapper.CreateMap<Source, DestinationDerived1>() .ForMember(d => d.Test4, e => e.MapFrom(s => s.Test2)); Mapper.CreateMap<Source, DestinationDerived2>() .ForMember(d => d.Test5, e => e.MapFrom(s => s.Test2));

AutoMapper.AutoMapperConfigurationException: Se encontraron miembros no asignados. Revise los tipos y miembros a continuación.

Agregue una expresión de mapeo personalizada, ignore, agregue una resolución personalizada o modifique el tipo de origen / destino

Origen -> DestinationDerived1 (lista de miembros de destino)

Prueba 3


Incluir mapeos derivados en el mapeo base:

Mapper.CreateMap<Source, DestinationBase>() .ForMember(d => d.Id, op => op.MapFrom(s => s.Id)) // you can remove this .Include<Source, DestinationDerived1>() .Include<Source, DestinationDerived2>(); Mapper.CreateMap<Source, DestinationDerived1>() .ForMember(d => d.Name, op => op.MapFrom(s => s.Text)) .ForMember(d => d.Value2, op => op.MapFrom(s => s.Amount)); Mapper.CreateMap<Source, DestinationDerived2>() .ForMember(d => d.Value, op => op.MapFrom(s => s.Amount));

Uso:

Mapper.AssertConfigurationIsValid(); var s = new Source() { Id = 2, Amount = 10M, Text = "foo" }; var d1 = Mapper.Map<DestinationDerived1>(s); var d2 = Mapper.Map<DestinationDerived2>(s);

Ver la herencia de mapeo en el wiki de AutoMapper.

ACTUALIZACIÓN: Aquí está el código completo de las clases que funciona como debería.

public class Source { public int Id { get; set; } public string Text { get; set; } public decimal Amount { get; set; } } public class DestinationBase { public int Id { get; set; } } public class DestinationDerived1 : DestinationBase { public string Name { get; set; } public decimal Value2 { get; set; } } public class DestinationDerived2 : DestinationBase { public decimal Value { get; set; } }

ACTUALIZACIÓN (solución alternativa de error de AutoMapper):

public static class Extensions { public static IMappingExpression<Source, TDestination> MapBase<TDestination>( this IMappingExpression<Source, TDestination> mapping) where TDestination: DestinationBase { // all base class mappings goes here return mapping.ForMember(d => d.Test3, e => e.MapFrom(s => s.Test)); } }

Y todas las asignaciones:

Mapper.CreateMap<Source, DestinationBase>() .Include<Source, DestinationDerived1>() .Include<Source, DestinationDerived2>() .MapBase(); Mapper.CreateMap<Source, DestinationDerived1>() .MapBase() .ForMember(d => d.Test4, e => e.MapFrom(s => s.Test2)); Mapper.CreateMap<Source, DestinationDerived2>() .MapBase() .ForMember(d => d.Test5, e => e.MapFrom(s => s.Test2));