使用Autofac集成AutoMapper时遭遇ComponentNotRegisteredException异常
解决Autofac注册AutoMapper.IMapper的错误
错误原因
你调用CreateMapper()无参方法时,AutoMapper会尝试自行构建内部服务提供器,无法和Autofac的依赖注入体系兼容,导致抛出ComponentNotRegisteredException: 请求的服务'System.Object'未注册错误。同时你的注册代码未明确指定Autofac上下文类型,导致无法调用Resolve方法。
正确注册步骤
1. 注册MapperConfiguration为单例
MapperConfiguration是重量级对象,需全局单例复用:
' 注册MapperConfiguration(单例) Builder.Register(Function(context As IComponentContext) Return New MapperConfiguration(Sub(config) config.AddProfile(Of MappingProfile)() End Sub) End Function).SingleInstance()
2. 注册IMapper并关联Autofac上下文
明确指定上下文类型为IComponentContext,让AutoMapper通过Autofac解析依赖:
' 注册IMapper(每个生命周期域实例一个) Builder.Register(Function(context As IComponentContext) Dim config = context.Resolve(Of MapperConfiguration)() ' 传入Autofac的解析逻辑给AutoMapper Return config.CreateMapper(Function(serviceType) context.Resolve(serviceType)) End Function).As(Of IMapper)().InstancePerLifetimeScope()
验证解析
你的原有解析代码无需修改,保持即可:
Using oScope As ILifetimeScope = Me.Container.BeginLifetimeScope oMapper = oScope.Resolve(Of IMapper) End Using
关键说明
- 必须明确注册委托的参数类型为
IComponentContext,避免参数被隐式转为System.Object,才能正常调用Resolve方法。 - MapperConfiguration单例注册可避免重复初始化映射配置,提升性能。
- 通过
config.CreateMapper(Function(serviceType) context.Resolve(serviceType))让AutoMapper复用Autofac的依赖注入容器,解决服务找不到的问题。
内容的提问来源于stack exchange,提问作者InteXX
相关产品推荐
相关产品推荐

