2017-02-22 4 views
0

Я пытаюсь зарегистрировать свой AutoMapper (версия 5.2.0) Профиль класса в мой контейнер Unity (Unity версия 4.0.1), и это дает мне исключение:AutoMapper Единство AutoMapper.IConfigurationProvider Выпуск

Постановление ошибка отсутствует, type = IConsumer`1 [Commands.INewUserEmailCommand] ", name =" (none) ". Исключение произошло, когда: при разрешении. Исключение: InvalidOperationException - текущий тип, AutoMapper.IConfigurationProvider, является интерфейсом и не удалось построить. Вам не хватает картирования типа?

Категория:

public class AutoMapperBootstrap : Profile 
    { 
     public AutoMapperBootstrap() 
     { 
      this.CreateMap<IUserEmailDTO, MergeUserEmailRequest>(); 
     } 
    } 

А вот Unity регистрация сниппет:

Profile typeMaps = new AutoMapperBootstrap(); 
var config = new MapperConfiguration(cfg => cfg.AddProfile(typeMaps)); 
container.RegisterInstance<IMapper>(config.CreateMapper(), new ContainerControlledLifetimeManager()); 

Тогда у меня есть конструкторы, которые зависят от экземпляра IMapper впрыскивают, по-видимому Unity ничего не знает о или нужен дополнительный экземпляр IConfigurationProvider? Что мне не хватает? Когда мой код должен вызывать службу, которая полагается на IMapper, Unity выбрасывает исключение выше. Ниже приведен пример службы, использующей инъекцию конструктора, которая пытается получить экземпляр IMapper.

public class FooService : IFooService 
{ 
    private readonly IMapper mapper; 

    public Foo(IMapper mapper) 
    { 
    this.mapper = mapper; 
    } 
} 
+0

Должен ли я просто пропустить регистрацию контейнера и использовать статический экземпляр, который имеет все сопоставления? Я думаю, что статический конструктор инициализирует мой профиль, чтобы он всегда был доступен ... – Andy

ответ

0

@Andy, я думаю, вы просто скопировать часть ошибки на вашем отображении, как правило, automapper дает вам более подробную информацию, где она терпит неудачу и может дать вам подсказку.

На линии ниже вы пытаетесь зарегистрировать экземпляр класса IMapper

container.RegisterInstance<IMapper>(config.CreateMapper(), new ContainerControlledLifetimeManager()); 

Если вы посмотрите на то, как на самом деле CreateMapper работы вы увидите, что он использует IConfigurationProvider, проверьте automapper оригинал код ниже

public class MapperConfiguration : IConfigurationProvider 
{ 
    ..... 

    public IMapper CreateMapper() 
    { 
     return (IMapper) new Mapper((IConfigurationProvider) this); 
    } 

    ..... 
} 

Когда automapper пытается создать экземпляр Mapper пытается решить, а параметр IConfigurationProvider. В этом случае вы никогда не вводили этот параметр. Разрешение: Вводят экземпляр этого параметра и все

Здесь я сохраню вам пример того, как я использую его

class Helper 
{ 
    public static MapperConfiguration InitializeAutoMapper() 
    { 
     MapperConfiguration config = new MapperConfiguration(cfg => 
     { 
      cfg.AddProfile(new ProfileA()); 
      cfg.AddProfile(new ProfileB()); 
     }); 

     return config; 
    } 
} 

Регистрация на вашем Unity, где container является экземпляром IUnityContainer

var mapperConfig = Helper.InitializeAutoMapper(); 
var mapper = mapperConfig.CreateMapper(); 
container.RegisterType<IMapper, Mapper>(new InjectionConstructor(mapperConfig)); 
container.RegisterInstance(mapper, Activator.CreateInstance<T>()); 
Смежные вопросы