设置Autofac以使用Automapper时出现问题

时间:2016-03-09 20:03:29

标签: c# automapper autofac

我在我的应用程序中使用最新版本的Automapper,以及Autofac。我设置了配置和配置文件,并使用name对我的所有配置文件进行了单元测试,一切正常。 但是,当我使用mapper时 在我的应用程序中,只有从代码运行时才会得到div异常,我怀疑这与我如何设置映射器以使用Autofac有关:

AssertIsConfigurationValid()

我正在尝试在我的应用程序中将"Automapper missing type map configuration or unsupported mapping"映射到 // 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); } ,它告诉我LetterDomainLetterDto的配置缺失,尽管我确实创建了映射..

在这里真的想要一些帮助..

提前致谢!

编辑: 我只想添加所有其他不使用静态Mapper.Map&lt;&gt;的映射。在他们的配置文件中,在应用程序中工作良好

3 个答案:

答案 0 :(得分:0)

一个问题是,您没有指定从. . . <ASIMD instruction> <ASIMD instruction> <ASIMD instruction> <Data MOV between ASIMD vectors and ARM Reg> <ARM assembly instruction> ------- <ASIMD instruction> <ARM assembly instruction> ------- <ASIMD instruction> <ARM assembly instruction> ------- <ASIMD instruction> <Data MOV between ARM Reg and ASIMD vectors> <ARM assembly instruction> ------- <ASIMD instruction> <ARM assembly instruction> ------- <ASIMD instruction> <ARM assembly instruction> ------- <ASIMD instruction> . . . DestinationDto.Name的映射时应填充LetterDomain的方式。

换句话说,DestinationDto没有LetterDomain属性,因此该属性不可能自动映射。

答案 1 :(得分: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>();
    }

希望有所帮助:)

答案 2 :(得分:0)

就我而言,我的映射配置文件存在于其他任何项目未引用的单独的dll中。通过添加对我的映射配置文件.dll的引用,它解决了我的问题。