2016-03-09 1 views
0

Я использую последнюю версию Automapper в своем приложении вместе с Autofac. Я установил конфигурации, профили и блок, проверил все мои профили с AssertIsConfigurationValid(), и все работает нормально. Однако, когда я использую картограф в моем приложении я получаю "Automapper missing type map configuration or unsupported mapping" исключение только при запуске из кода, я подозреваю, что это что-то делать с тем, как я установил картограф работать с Autofac:Проблемы с настройкой Autofac для работы с Automapper

// This is how I register my mapper with Autofac 
    public class ModelsMapperModule : Module 
    { 
     protected override void Load(ContainerBuilder builder) 
     { 
      builder.RegisterAssemblyTypes().AssignableTo(typeof(Profile)).As<Profile>(); 

      builder.Register(c => new MapperConfiguration(cfg => 
      { 
       foreach (var profile in c.Resolve<IEnumerable<Profile>>()) 
       { 
        cfg.AddProfile(profile); 
       } 
      })).AsSelf().SingleInstance(); 

      builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope(); 
     } 
    } 


// Here is a simple version of my objects and mappings: 

public class LetterDomain 
{ 
    public List<StationDomain> Stations {get; set;} 

    public string Title {get; set;} 

    public int Id {get; set;} 

    public int TimeCreated {get; set;} 

    public string File {get; set;} 

    public bool IsSecret {get; set;} 
} 

public class StationDomain 
{ 
    public int Id {get; set;} 

    public string Owner {get; set;} 

    public string Name {get; set;} 
} 

public class LetterDto 
{ 
    public DestinationDto Dest {get; set;} 

    public int Id {get; set;} 
} 

public class DestinationDto 
{ 
    public List<StationDto> Stations {get; set;} 
} 

public class StationDto 
{ 
    public string Name {get; set;} 
} 

public class MyProfile : Profile 
{ 
    protected override void Configure 
    { 
     CreateMap<StationDomain, StationDto>() 

     CreateMap<LetterDomain, DestinationDto>(); 

     CreateMap<LetterDomain, LetterDto>() 
      .ForMember(x => x.Dest, opt => opt.MapFrom(src => Mapper.Map<DestinationDto>(src))); 
    } 
} 


public void MyMethodInsideApplication(LetterDomain letter) 
{ 
    // Exception is thrown here 
    var dto = _mapper.Map<LetterDto>(letter); 
} 

Я м пытается отобразить LetterDomain к LetterDto в моем приложении, и он говорит мне, что конфигурация LetterDomain в DestinationDto отсутствует, хотя я определенно создал отображение ..

действительно хотел бы некоторую помощь здесь ..

Спасибо заранее!

Edit: Я просто хочу добавить, что все другие отображения, которые не используют статический Mapper.Map <> внутри их профиля конфигурации хорошо работают в приложении

+0

В каком классе делает 'метод MyMethodInsideApplication' жить? Был ли такой класс создан через контейнер? Можете ли вы показать, как? –

+0

Это синглтон, он разрешен в startapp –

+0

Где вы используете статический метод «Mapper.Map <>»? можете ли вы показать этот код? –

ответ

0

Одна проблема заключается в том, что вы не указали, как DestinationDto.Name должен быть заполнен при отображении от LetterDomain до DestinationDto.

Иными словами, LetterDomain не имеет свойства Name, поэтому автоматическое сопоставление не возможно.

+0

Мой плохой, выложил неправильный..fixed сейчас. Я уверен, что все карты в порядке. Я попробовал это в модульных тестах, и это хорошо. Это должно быть чем-то связанным с моим кодом приложения - в частности, использование статического картографа после настройки отображения регистров –

+0

Я думал, что это может быть просто было ваше сообщение, так как вы сказали, что проверка прошла успешно. Возможно, этот ответ поможет: http://stackoverflow.com/questions/35565524/cannot-resolve-automapper-imapper-using-automapper-4-2-with-autofac/35566443#35566443 – devuxer

+0

Несмотря на то, что регистрация с Autofac выглядит нормально, потому что я успешно использую mapper в других частях приложения, где карта конфигурации не использует статический метод Mapper.Map <>. Независимо от того, есть ли причина для регистрации как IMapper, так и IMappingEngine? –

0

Я думаю, вы не можете одновременно использовать статическую, а не статическую версию устройства отображения (если только вы не создаете статическую, а не статическую карту, но бесполезны); кстати, вам не нужно использовать

CreateMap<LetterDomain, LetterDto>() 
     .ForMember(x => x.Dest, opt => opt.MapFrom(src => Mapper.Map<DestinationDto>(src))); 

применить карту, просто

CreateMap<LetterDomain, LetterDto>() 
     .ForMember(x => x.Dest, opt => opt.MapFrom(src)); 

Карта будет применяться автоматически, если существует.

Можно также упростить процесс отображения немного, если вы хотите:

protected override void Load(ContainerBuilder builder) 
    { 
     var profiles = 
      from t in typeof (MapperModuleRegistration).Assembly.GetTypes() 
      where typeof (Profile).IsAssignableFrom(t) 
      select (Profile) Activator.CreateInstance(t); 

     var config = new MapperConfiguration(cfg => 
     { 
      foreach (var profile in profiles) 
      { 
       cfg.AddProfile(profile); 
      } 
     }); 

     builder.RegisterInstance(config).As<MapperConfiguration>(); 
     builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper()).As<IMapper>(); 
    } 

Надеется, что это помогает :)

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