Автоматическое обнаружение конфигураций автоматического устройства
Когда вы создаете контроллер в MVC, вам не нужно делать дополнительную регистрацию для него. То же самое касается добавления областей. Пока ваш global.asax имеет вызов AreaRegistration.RegisterAllAreas(), дополнительная настройка не требуется.
С AutoMapper, мы должны зарегистрировать сопоставления, используя какой-то CreateMap<TSource, TDestination>
вызов. Можно сделать это явно со статическим Mapper.CreateMap
или исходя из AutoMapper.Profile
класс, переопределяя Configure
метод и вызов CreateMap
оттуда.
Мне кажется, что нужно уметь сканировать сборку на наличие классов, которые выходят из Profile
как MVC сканирует для классов, которые выходят из Controller
, При таком механизме не должно быть возможности создавать отображения просто путем создания класса, производного от Profile
? Существует ли какой-либо такой библиотечный инструмент или есть что-то встроенное в autopper?
2 ответа
Я не знаю, существует ли такой инструмент, но написание одного должно быть довольно тривиальным:
public static class AutoMapperConfiguration
{
public static void Configure()
{
Mapper.Initialize(x => GetConfiguration(Mapper.Configuration));
}
private static void GetConfiguration(IConfiguration configuration)
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in assemblies)
{
var profiles = assembly.GetTypes().Where(x => x != typeof(Profile) && typeof(Profile).IsAssignableFrom(x));
foreach (var profile in profiles)
{
configuration.AddProfile((Profile)Activator.CreateInstance(profile));
}
}
}
}
а затем в вашем Application_Start
Вы могли бы автоматически подключить:
AutoMapperConfiguration.Configure();
В качестве незначительного улучшения ответа от @Darin Dimitrov, в AutoMapper 5 вы можете дать ему список сборок для сканирования следующим образом:
//--As of 2016-09-22, AutoMapper blows up if you give it dynamic assemblies
var assemblies = AppDomain.CurrentDomain.GetAssemblies()
.Where(x => !x.IsDynamic);
//--AutoMapper will find all of the classes that extend Profile and will add them automatically
Mapper.Initialize(cfg => cfg.AddProfiles(assemblies));