Group Mapping Logic with Profile
In the previous section, you've created your first Mappings for Bio <-> BioDto
and User <-> UserDto
createMap(
mapper,
Bio,
BioDto,
typeConverter(Date, String, (date) => date.toDateString()),
namingConventions(new CamelCaseNamingConvention())
);
createMap(
mapper,
User,
UserDto,
forMember(
(destination) => destination.fullName,
mapFrom((source) => source.firstName + ' ' + source.lastName)
)
);
This approach works completely fine but when the application starts growing with more entities, these configurations will also start growing. Profile
is a way to group Mappings of related entities into a MappingProfile
, so you can focus on a specific domain when working with a certain set of entities.
Your first MappingProfile
MappingProfile
is a function that will be called with the Mapper
and returns void
.
const bioProfile: MappingProfile = (mapper) => {
createMap(
mapper,
Bio,
BioDto,
typeConverter(Date, String, (date) => date.toDateString()),
namingConventions(new CamelCaseNamingConvention())
);
};
When you have more models/DTOs related to Bio
, you can group them all under bioProfile
. Repeat the process with User <-> UserDto
.
To use MappingProfile
, call addProfile()
with your Mapper
object and the MappingProfile
addProfile(mapper, bioProfile);
addProfile(mapper, userProfile);
tip
Order of the MappingProfile
matters. bioProfile
goes first because userProfile
depends on Mapping<Bio, BioDto>
Share MappingConfiguration
One benefit of using MappingProfile
is that you can share some common MappingConfiguration
for all createMap()
inside of a specific MappingProfile
.
Let's assume you have the following Mappings
const bioProfile: MappingProfile = (mapper) => {
const camelCaseNamingConvention = new CamelCaseNamingConvention();
createMap(
mapper,
Bio,
BioDto,
namingConventions(camelCaseNamingConvention),
extend(Base, BaseDto)
);
createMap(
mapper,
Bio,
BioInformationDto,
namingConventions(camelCaseNamingConvention),
extend(Base, BaseDto)
);
createMap(
mapper,
Bio,
MinimalBioDto,
namingConventions(camelCaseNamingConvention),
extend(Base, BaseDto)
);
};
Instead of repeating the same MappingConfiguration
on each createMap()
like above, you can pass the MappingConfiguration
in addProfile()
instead
const bioProfile: MappingProfile = (mapper) => {
createMap(mapper, Bio, BioDto);
createMap(mapper, Bio, BioInformationDto);
createMap(mapper, Bio, MinimalBioDto);
};
addProfile(
mapper,
bioProfile,
namingConventions(new CamelCaseNamingConvention()),
extend(Base, BaseDto)
);