Overview
Convention over Configuration
AutoMapper does have Auto in its name. If we follow closely Conventions, we rarely need MappingConfiguration
.
As we have already seen in previous examples, matching properties are mapped automatically as long as the metadata is provided.
class User {
@AutoMap()
firstName!: string;
@AutoMap()
lastName!: string;
}
class UserDto {
@AutoMap()
firstName!: string;
@AutoMap()
lastName!: string;
}
Nested models are also auto-mapped.
class Address {
@AutoMap()
street!: string;
}
class Bio {
@AutoMap()
text!: string;
@AutoMap(() => [Address])
addresses: Address[] = [];
}
class User {
@AutoMap(() => Bio)
bio!: Bio;
}
class AddressDto {
@AutoMap()
street!: string;
}
class BioDto {
@AutoMap()
text!: string;
@AutoMap(() => [AddressDto])
addresses: AddressDto[] = [];
}
class UserDto {
@AutoMap(() => BioDto)
bio!: BioDto;
}
In addition, there is Auto Flattening. These features should encourage us to stay as close to the conventions as possible.
Custom Configuration
MappingConfiguration
are functions that augment a Mapping
. When creating a Mapping
with createMap()
, we can pass in as many MappingConfiguration
as we like and in any order that we want.
mapping configuration | description |
---|---|
afterMap() | Attach a MapCallback to run after the map operation |
beforeMap() | Attach a MapCallback to run before the map operation |
constructUsing() | Set a custom constructor for the Destination before the map operation |
extend() | Extend another Mapping |
forMember() | Configure a MappingTransformation for a property on the Destination |
forSelf() | Configure flattening for Destination from a different Source |
namingConventions() | Configure the NamingConvention for this Mapping |
typeConverters() | Configure the TypeConverter for this Mapping |
caution
If the Mapping have an absurd amount of custom MappingConfiguration
, it's time to re-evaluate the models or if AutoMapper is the right tool for the project.