2015-11-29 2 views
2

Каков правильный способ вставки AutoMapper в другие слои?Как вводить AutoMapper с помощью Autofac?

Я читал этот блог post, но это исключение причины кода ниже

Исключение типа «AutoMapper.AutoMapperMappingException» произошло в AutoMapper.dll, но не был обработан в пользовательском коде

когда попробуйте выполнить сопоставление на уровне обслуживания.

конфигурации
List<StudentViewModel> list2 = _mapper.Map<List<StudentViewModel>>(list); 

Мои AutoFac, как показано ниже:

public static class DependencyRegistration 
{ 
    public static void Config() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterControllers(typeof(MvcApplication).Assembly); 


     builder.RegisterType<TypeMapFactory>().As<ITypeMapFactory>(); 
     builder.RegisterType<ConfigurationStore>().As<ConfigurationStore>().WithParameter("mappers", MapperRegistry.Mappers).SingleInstance(); 
     builder.Register((ctx, t) => ctx.Resolve<ConfigurationStore>()).As<IConfiguration>().As<IConfigurationProvider>(); 
     builder.RegisterType<MappingEngine>().As<IMappingEngine>(); 

     //... 
     var container = builder.Build(); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
    } 
} 
+0

Вы создали карту между типами, которые собираетесь преобразовать? –

+1

Что такое сообщение об исключении? –

+0

@YacoubMassad да, я создал классы профилей и зарегистрировал их. –

ответ

3

кажется, что вам нужно использовать IConfiguration объект, который зарегистрирован в контейнере для создания карт, как это:

var configuration = container.Resolve<IConfiguration>(); 
configuration.CreateMap<Student, StudentViewModel>(); 

Я думаю, что вы должны делать это в начале вашего заявления.

Вот лучший способ (ИМО), чтобы настроить вещи в Config метод:

public static void Config() 
{ 
    var configuration_store = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers); 

    var mapping_engine = new MappingEngine(configuration_store); 

    configuration_store.CreateMap<Student, StudentViewModel>(); 

    var builder = new ContainerBuilder(); 

    builder.RegisterInstance(mapping_engine).As<IMappingEngine>(); 

    //... 
    var container = builder.Build(); 
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
} 

я предполагаю, что в последнем примере, что ваши классы должны иметь доступ только к IMappingEngine (и не IConfiguration), так как вы должны уже настроить все сопоставления в методе Config (или какой-либо другой метод настройки при запуске приложения).

+0

, который вы произносите в профиле? как получить контейнер? –

+0

Нет, я предлагаю вам сделать это в классе 'DependencyRegistration' –

+0

Спасибо за ваш ответ, у меня есть несколько сложных классов профилей, я думаю, что это хорошая идея. Конфигурации AutoMapper переданы в класс DependencyRegistration? –

Смежные вопросы