How to scan and auto-configure profiles in AutoMapper?
Yeah, that would be fantastic...and exactly what I'm overhauling for V2. Scanning, registration, conventions etc.
There's not a good "What do I have" feature, but I think it would definitely be worth adding.
I found this post while searching as well, but this is how I implemented an auto mapping scheme:
public class MyCustomMap : Profile
{
protected override void Configure()
{
CreateMap<MyCustomViewModel, MyCustomObject>()
.ForMember(dest => dest.Phone,
opt => opt.MapFrom(
src => src.PhoneAreaCode + src.PhoneFirstThree + src.PhoneLastFour));
}
}
public static class AutoMapperConfiguration
{
public static void Configure()
{
Mapper.Initialize(x => GetConfiguration(Mapper.Configuration));
}
private static void GetConfiguration(IConfiguration configuration)
{
var profiles = typeof(MyCustomMap).Assembly.GetTypes().Where(x => typeof(Profile).IsAssignableFrom(x));
foreach (var profile in profiles)
{
configuration.AddProfile(Activator.CreateInstance(profile) as Profile);
}
}
}
So when my application starts, all I call is
AutoMapperConfiguration.Configure();
And all my maps are registered.
In version 9 of AutoMapper it can be done this way
var configuration = new MapperConfiguration(cfg =>
{
// Add all Profiles from the Assembly containing this Type
cfg.AddMaps(typeof(MyApp.SomeClass));
});
If you are using ASP.NET Core there is a helper extension to register all Profiles in Startup.ConfigureServices
// UI project
services.AddAutoMapper(Assembly.GetExecutingAssembly());
or
// Another assembly that contains a type
services.AddAutoMapper(Assembly.GetAssembly(typeof(MyApp.SomeClass)));
In the latest versions of AutoMapper it's possible to register multiple Profile scanning one or more assemblies :
Mapper.Initialize(x => x.AddProfiles(typeof(MyMappingProfile).Assembly));
Tested with AutoMapper v. 6.0.2.0