使用AutoMapper 4.2和Autofac无法解析AutoMapper.IMapper

我尝试过各种各样的排列,但我目前的配置(因为它与AutoMapper有关)是这样的:

builder.RegisterAssemblyTypes().AssignableTo(typeof(Profile)).As(); builder.Register(c => new MapperConfiguration(cfg => { foreach (var profile in c.Resolve<IEnumerable>()) { cfg.AddProfile(profile); } })).AsSelf().SingleInstance(); builder.Register(c => c.Resolve().CreateMapper(c.Resolve)).As().InstancePerLifetimeScope(); builder.RegisterType().As(); 

我有一个使用IMapper mapper的构造函数,但是我继续得到YSOD:

 None of the constructors found with'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type '' can be invoked with the available services and parameters: Cannot resolve parameter 'AutoMapper.IMapper mapper' of constructor 'Void .ctor(...,...,..., AutoMapper.IMapper)'. 

这个类在没有automapper引用的情况下工作得很好,所以我确定麻烦在于我的automapper配置。

我不确定我在这里缺少什么,因为我对AutoFac和AutoMapper都很陌生。

编辑:

我也尝试过:

 builder.Register(c => new MapperConfiguration(cfg => { cfg.CreateMap().ReverseMap(); })).AsSelf().SingleInstance(); builder.Register(ctx => ctx.Resolve().CreateMapper()).As(); //I've tried both of these lines separately, neither work builder.Register(c => c.Resolve().CreateMapper(c.Resolve)).As().InstancePerLifetimeScope(); 

我还尝试根据评论中的建议手动添加配置文件

正如我在评论中提到的,您的AutoFac代码似乎是正确的(除了程序集扫描部分)。

我创建了以下测试应用程序,它确实在没有任何exception的情况下运行,并将3放入“输出”窗口(按预期):

 using System.Diagnostics; using Autofac; using AutoMapper; namespace Sandbox { public partial class App { public App() { var builder = new ContainerBuilder(); builder.Register( c => new MapperConfiguration(cfg => { cfg.AddProfile(new TestProfile()); })) .AsSelf() .SingleInstance(); builder.Register( c => c.Resolve().CreateMapper(c.Resolve)) .As() .InstancePerLifetimeScope(); builder.RegisterType() .As(); builder.RegisterType().AsSelf(); var container = builder.Build(); container.Resolve(); } } public class TestProfile : Profile { protected override void Configure() { CreateMap(); } } public class Test { public Test(IMapper mapper) { var source = new Source { Id = 3 }; var destination = mapper.Map(source); Debug.Print(destination.Id.ToString()); } } public class Source { public int Id { get; set; } } public class Destination { public int Id { get; set; } } } 

我建议在版本控制中创建一个新的应用程序分支,然后剥离它直到它工作。

Interesting Posts