多个 Ninject 模块给出奇怪的行为
Multiple Ninject Modules giving odd behaviour
这个有点复杂,但在我的环境中可以重现。架构如下;
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
中的绑定(对于控制台应用程序, 而不是 正在 运行 的网络项目)更改为正在关注;
class NinjectBindingsModule : NinjectModule
{
public override void Load()
{
Bind<PBADBEntities>().ToSelf();
Bind<ISomeService>().To<SomeService>();
Bind<IAnotherService>().To<AnotherService>();
}
}
然后web 项目就可以正常工作了。 Web 项目中没有对 NinjectBindingsModule class 的明确引用,如果我在其中放置一个断点,也不会命中任何断点。如果我把它放在 NinjectWebBindings
中并正常继续,就会遇到断点。
这意味着 Ninject 正在加载或以其他方式扫描引用程序集中的所有模块,并在绑定方面对它们执行某些操作。关于如何在每个模块没有单独项目的情况下解决此问题的任何想法?
这个 post 是旧的,但我想我会 post 在这里找到答案。这个问题原来是 Ninject 中的一个错误,后来在 3.2.1 版中得到修复。将上面的体系结构用于其他解决方案和更高版本工作得很好并且问题消失了。简而言之,如果可以,请升级Ninject。
这个有点复杂,但在我的环境中可以重现。架构如下;
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
中的绑定(对于控制台应用程序, 而不是 正在 运行 的网络项目)更改为正在关注;
class NinjectBindingsModule : NinjectModule
{
public override void Load()
{
Bind<PBADBEntities>().ToSelf();
Bind<ISomeService>().To<SomeService>();
Bind<IAnotherService>().To<AnotherService>();
}
}
然后web 项目就可以正常工作了。 Web 项目中没有对 NinjectBindingsModule class 的明确引用,如果我在其中放置一个断点,也不会命中任何断点。如果我把它放在 NinjectWebBindings
中并正常继续,就会遇到断点。
这意味着 Ninject 正在加载或以其他方式扫描引用程序集中的所有模块,并在绑定方面对它们执行某些操作。关于如何在每个模块没有单独项目的情况下解决此问题的任何想法?
这个 post 是旧的,但我想我会 post 在这里找到答案。这个问题原来是 Ninject 中的一个错误,后来在 3.2.1 版中得到修复。将上面的体系结构用于其他解决方案和更高版本工作得很好并且问题消失了。简而言之,如果可以,请升级Ninject。