I have the following Domain Object:
public class DomainClass { public int Id { get; set; } public string A { get; set; } public string B { get; set; } }
I have the following two objects that I want to map to:
public class Parent { public int Id { get; set; } public string A { get; set; } public Child Child { get; set; } } public class Child { public int Id { get; set; } public string B { get; set; } }
I set up the following maps:
Mapper.CreateMap<DomainClass, Parent>(); Mapper.CreateMap<DomainClass, Child>();
If I map my object using the following call then the parent.Child property is null.
var domain = GetDomainObject(); var parent = Mapper.Map<DomainClass, Parent>(domain); // parent.Child is null
I know I can write the following:
var domain = GetDomainObject(); var parent = Mapper.Map<DomainClass, Parent>(domain); parent.Child = Mapper.Map<DomainClass, Child>(domain);
Is there a way I can eliminate that second call and have AutoMapper do this for me?
With both flattening and nested mappings, we can create a variety of destination shapes to suit whatever our needs may be.
AutoMapper will map property with private setter with no problem. If you want to force encapsulation, you need to use IgnoreAllPropertiesWithAnInaccessibleSetter. With this option, all private properties (and other inaccessible) will be ignored.
How do I use AutoMapper? First, you need both a source and destination type to work with. The destination type's design can be influenced by the layer in which it lives, but AutoMapper works best as long as the names of the members match up to the source type's members.
You just need to specify that in the mapping:
Mapper.CreateMap<DomainClass, Child>(); Mapper.CreateMap<DomainClass, Parent>() .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id)) .ForMember(d => d.A, opt => opt.MapFrom(s => s.A)) .ForMember(d => d.Child, opt => opt.MapFrom(s => Mapper.Map<DomainClass, Child>(s)));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With