多个Ninject模块给出奇怪的行为
本文关键字:Ninject 模块 多个 | 更新日期: 2023-09-27 18:11:53
这个有点复杂,但在我的环境中可以重现。
BindingsLayer
+-NinjectBindingsModule
+-NinjectWebBindingsModule
ContractsLayer
+- ISomeService
+- IAnotherService
DomainLayer
+- SomeService : ISomeService
+- AnotherService : IAnotherService
{
public AnotherService(ISomeService) {}
}
PersistenceLayer
+- PBADBEntities (Entity framework context)
WebProjectA
+- Uses bindings in NinjectWebBindingsModule
ConsoleProjectB
+- Uses bindings in NinjectBindingsModule
Ninject模块实现
class NinjectBindingsModule : NinjectModule
{
public override void Load()
{
Bind<PBADBEntities>().ToSelf();
Kernel.Bind(s => s.FromAssembliesMatching("MySolution.*.dll")
.SelectAllClasses()
.BindDefaultInterfaces()
);
}
}
class NinjectWebBindingsModule : NinjectModule
{
public override void Load()
{
Bind<PBADBEntities>().ToSelf();
Kernel.Bind(s => s.FromAssembliesMatching("MySolution.*.dll")
.SelectAllClasses()
.BindDefaultInterfaces()
.InRequestScope()
);
}
}
现在,如果我运行web项目并出现以下错误,上面的内容就会中断;
Error activating ISomeService. No matching bindings are available, and the type is not self-bindable.
但是,如果我更改NinjectBindingsModule
中的绑定(对于控制台应用程序,而不是正在运行的web项目),则为:
class NinjectBindingsModule : NinjectModule
{
public override void Load()
{
Bind<PBADBEntities>().ToSelf();
Bind<ISomeService>().To<SomeService>();
Bind<IAnotherService>().To<AnotherService>();
}
}
则web项目工作正常。从web项目中没有显式地引用ninectbindingsmodule类,如果我在那里放置一个断点,也不会命中任何断点。如果我将它放在NinjectWebBindings
中并继续正常运行,则会遇到断点。
这意味着Ninject正在加载或扫描引用程序集中的所有模块,并对它们做一些关于绑定的事情。任何关于如何解决这个问题,而没有每个模块单独的项目的想法?
这是一个旧的帖子,但我想我把答案贴在这里。这个问题原来是Ninject的一个bug,后来在3.2.1版本中修复了。将上面的架构用于其他解决方案的后续版本工作得很好,问题消失了。简而言之,如果可以的话,升级Ninject。