Как зарегистрировать AutoMapper 4 с помощью простого инжектора 3

У меня есть веб-задание Azure, которое анализирует CSV-категории и отображает результат в обычные объекты.

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

AutoMapper.AutoMapperMappingException: отсутствует конфигурация карты типов или не поддерживается отображение.

Типы картографирования:

CsvCategory -> Категория

WebJobs.Data.CsvCategory -> Data.Category

Путь назначения: Категория

Исходное значение: WebJobs.Data.CsvCategory

container.RegisterSingleton<ITypeMapFactory, TypeMapFactory>();
container.RegisterCollection<IObjectMapper>(MapperRegistry.Mappers);
container.RegisterSingleton<ConfigurationStore>();
container.RegisterSingleton<IConfiguration, ConfigurationStore>();
container.RegisterSingleton<IConfigurationProvider, ConfigurationStore>();
container.RegisterSingleton<IMappingEngine>(Mapper.Engine);

Mapper.Initialize(c =>
{
    c.ConstructServicesUsing(container.GetInstance);
    c.AddProfile<CsvCategoryMappingProfile>();
});

public sealed class CsvCategoryMappingProfile : Profile
{
    protected override void Configure() {
        CreateMap<CsvCategory, Category>();
    }

    public override string ProfileName {
        get { return typeof(CsvCategoryMappingProfile).Name; }
    }
}

public sealed class MappingCategoryConverter : IConverter<CsvCategory, Category>
{
    private readonly IMappingEngine _mapper;

    public MappingCategoryConverter(IMappingEngine mapper)
    {
        _mapper = mapper;
    }

    public Category Convert(CsvCategory category)
    {
        return _mapper.Map<Category>(category);
    }
}

Я могу это исправить, заменив всю конфигурацию контейнера этой строкой:

Mapper.AddProfile<CsvCategoryMappingProfile>();

но вместо этого я хотел бы узнать, где проблема, где я делаю это неправильно.

1 ответ

Решение

Я не вижу, как использовать Mapper.Initialize() правильно, очевидный способ не работает.

Вот обходной путь:

Mapper.Initialize(x =>
{
    var config = container.GetInstance<IConfiguration>();
    config.ConstructServicesUsing(container.GetInstance);
    config.AddProfile<CsvCategoryMappingProfile>();
});

Потому что в x вы получаете еще один экземпляр IConfiguration,

Другие вопросы по тегам