Automapper - зачем использовать Mapper.Initialize? - программирование
Подтвердить что ты не робот

Automapper - зачем использовать Mapper.Initialize?

Обычно я не задавал бы этот вопрос здесь, но, к сожалению, AutoMapper кажется хорошей картографической библиотекой, ее документация ужасно плоха - XML-документации для библиотечных методов нет, и самая официальная онлайн-документация, которую я мог найти, была this, которая очень оживленная, Если у кого-то есть хорошая документация, сообщите мне.

Тем не менее, здесь вопрос: зачем использовать Mapper.Initialize? Кажется, это не требуется, поскольку вы можете просто использовать Mapper.CreateMap сразу, а поскольку документации нет, я не знаю, что делать Initialize.

4b9b3361

Ответ 1

Я спросил в списке пользователей AutoMapper, и этот ответ в основном говорит, почему:

https://groups.google.com/forum/?fromgroups=#!topic/automapper-users/0RgIjrKi28U

Это связано с тем, что AutoMapper делает детерминированную (стохастическую) оптимизацию. По производительности, лучше всего получить все ваши сопоставления, созданные в вызове Initialize.

Ответ 2

Инициализация запускает все создание карты один раз, поэтому затем выполняется, когда вы приходите делать свое сопоставление. Вы можете создавать карту всякий раз, когда захотите, но это замедлит ваш код, поскольку создание отображения связано с отражением.

Я считаю, что лучше всего использовать профили для моего кода сопоставления и для получения этой настройки выполните следующие действия:

public class AutoMapperConfiguration : IRequiresConfigurationOnStartUp
{
    private readonly IContainer _container;

    public AutoMapperConfiguration(IContainer container)
    {
        _container = container;
    }

    public void Configure()
    {
        Mapper.Initialize(x => GetAutoMapperConfiguration(Mapper.Configuration));
    }

    private void GetAutoMapperConfiguration(IConfiguration configuration)
    {
        var profiles = GetProfiles();
        foreach (var profile in profiles)
        {
            configuration.AddProfile(_container.GetInstance(profile) as Profile);
        }
    }

    private static IEnumerable<Type> GetProfiles()
    {
        return typeof(AutoMapperConfiguration).Assembly.GetTypes()
            .Where(type => !type.IsAbstract && typeof(Profile).IsAssignableFrom(type));
    }
}