使用Ninject ToMethod时NServiceBus找不到NinjectObjectBuilder作用域的问题
解决Ninject UnitOfWorkScope下解析依赖的异常问题
你遇到的是Ninject命名作用域(Named Scope)相关的依赖解析异常,核心问题出在获取MessagingContext实例的方式上。
问题原因
当你在ToMethod中调用c.Kernel.Get<MessagingContext>()时,它会直接从根容器中尝试获取实例,而不是从当前激活的UnitOfWorkScope作用域内查找。但你的MessagingContext明确绑定在UnitOfWorkScope作用域下,根容器无法定位到这个作用域内的实例,因此抛出命名作用域相关的异常。
修正方案
把c.Kernel.Get<MessagingContext>()改成c.Get<MessagingContext>(),利用当前的解析上下文IContext来获取依赖,这样就能正确关联到当前的UnitOfWorkScope作用域:
Bind<IBus>().ToMethod(c => { var messagingContext = c.Get<MessagingContext>(); // 改用当前上下文的Get方法 return new Bus(messagingContext); });
额外注意点
IContext.Get<T>()会沿着当前的解析链和激活的作用域查找实例,能正确识别InUnitOfWorkScope()定义的作用域规则;- 后续在Ninject中获取作用域绑定的依赖时,都应该优先使用
IContext的Get方法,而非直接调用Kernel.Get(),避免作用域不匹配的问题; - 确保你的
UnitOfWorkScope已经正确启动(比如通过using(var scope = kernel.BeginUnitOfWorkScope())的方式),否则即使修正了代码,也会因没有激活的作用域抛出异常。
内容的提问来源于stack exchange,提问作者alex.dev
相关产品推荐
相关产品推荐

