Автоматическое обнаружение конфигураций автоматического устройства

Когда вы создаете контроллер в 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));
Другие вопросы по тегам