这个有点复杂,但在我的环境中可以重现。架构如下;
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 项目中明确引用 NinjectBindingsModule 类,如果我在其中放置一个断点,也不会命中任何断点。NinjectWebBindings
如果我将断点插入并继续正常运行,则会遇到断点。
这意味着 Ninject 正在加载或以其他方式扫描引用程序集中的所有模块,并在绑定方面对它们做一些事情。关于如何在每个模块没有单独项目的情况下解决此问题的任何想法?