Multiple AutoMapper.Configure() in Global.asax
asp.net, asp.net-web-api, automapper, c#
Solution
The calls to Mapper.Initialize reset the mapper so everything that's gone before is wiped.
Move the calls to AddProfile into one Mapper.Initialize call and all should be well:
Mapper.Initialize(x =>
{
x.AddProfile<CmciFlowTestToGenericFlowTestSimpleMappingProfile>();
x.AddProfile<FsrsFlowTestToGenericFlowTestSimpleMappingProfile>();
x.AddProfile<ServiceToWebApiMappingProfile>();
x.AddProfile<WebApiToServiceMappingProfile>();
});
Problem
I am using AutoMapper to map between DTO objects and my business objects. I've two AutoMapperConfiguration.cs files - one in my service layer and another one in my web api layer. As shown in the answer at the following link Where to place AutoMapper.CreateMaps? I am calling the Configure() of both these files in my Global.asax class ``` AutoMapperWebConfiguration.Configure(); AutoMapperServiceConfiguration.Configure(); ``` but it seems like the my Service Configure call (the second call) is overwriting the mappings of the web api layer (the first call) and I get an exception saying the Mapping is missing. If I reverse the Configure calls to look like this ``` AutoMapperServiceConfiguration.Configure(); AutoMapperWebConfiguration.Configure(); ``` I don't get the exception for web api mapping but I get the same mapping exception for the Service layer. Am I doing something wrong because this is clearly marked as an answer in the above stack overflow link? Here's my code: ``` public static class AutoMapperServiceConfiguration { public static void Configure() { Mapper.Initialize(x => { x.AddProfile<CmciFlowTestToGenericFlowTestSimpleMappingProfile>(); x.AddProfile<FsrsFlowTestToGenericFlowTestSimpleMappingProfile>(); }); } } public class FsrsFlowTestToGenericFlowTestSimpleMappingProfile : Profile { protected override void Configure() { Mapper.CreateMap<FsrsFlowTest, GenericFlowTest>() .ConvertUsing<FsrsFlowTestToGenericFlowTestSimpleConverter>(); } } public class FsrsFlowTestToGenericFlowTestSimpleConverter : TypeConverter<FsrsFlowTest, GenericFlowTest> { protected override GenericFlowTest ConvertCore(FsrsFlowTest source) { if (source == null) { return null; } return new GenericFlowTest { FlowTestDate = source.FlowTestDates, StaticPsi = source.HydrantStaticPsi.ToString(), ResidualPsi = source.HydrantResidualPsi.ToString(), TotalFlow = source.NffGallonsPerMinute.ToString(), FlowTestLocation = source.FsrsFlowTestLocations.Any() ? source.FsrsFlowTestLocations.First().LocationDescription : null }; } public class CmciFlowTestToGenericFlowTestSimpleMappingProfile : Profile { protected override void Configure() { Mapper.CreateMap<CmciFlowTest, GenericFlowTest>() .ConvertUsing<CmciFlowTestToGenericFlowTestSimpleConverter>(); } } public class CmciFlowTestToGenericFlowTestSimpleConverter : TypeConverter<CmciFlowTest, GenericFlowTest> { protected override GenericFlowTest ConvertCore(CmciFlowTest source) { if (source == null) { return null; } return new GenericFlowTest { FlowTestDate = source.FlowTestDates, StaticPsi = source.HydrantStaticPsi.ToString(), ResidualPsi = source.HydrantResidualPsi.ToString(), TotalFlow = source.CalculatedHydrantGallonsPerMinute.ToString(), FlowTestLocation = source.StaticLocationHydrantFlowPSI }; } } public static class AutoMapperWebConfiguration { public static void Configure() { Mapper.Initialize(x => { x.AddProfile<ServiceToWebApiMappingProfile>(); x.AddProfile<WebApiToServiceMappingProfile>(); }); } } public class ServiceToWebApiMappingProfile : Profile { protected override void Configure() { Mapper.CreateMap<ServiceFlowTest, FlowTest>(); } } public class WebApiToServiceMappingProfile : Profile { protected override void Configure() { Mapper.CreateMap<PropertyAddress, ServicePropertyAddress>(); } } ``` To get around this issue, I am adding the service profiles in the AutoMapperWebConfiguration class and only calling AutoMapperWebConfiguration.Configure() in global.asax.