【发布时间】:2015-09-08 09:50:00
【问题描述】:
这个有点复杂,但在我的环境中可以重现。架构如下;
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 项目中明确引用 NinjectBindingsModule 类,如果我在其中放置一个断点,也不会命中任何断点。如果我将断点放在NinjectWebBindings 中并正常继续,则会触发断点。
这意味着 Ninject 正在加载或以其他方式扫描引用程序集中的所有模块,并在绑定方面对它们做一些事情。关于如何在每个模块没有单独项目的情况下解决此问题的任何想法?
【问题讨论】:
-
你是如何加载模块的?
-
@BatteryBackupUnit,通过自动创建的 App_Start\NinjectWebCommon.cs 文件。内核的实例化如下;
var kernel = new StandardKernel(new NinjectWebBindingsModule()); -
能否请您重新验证
NinjectBindingsModule.Load没有被执行?因为乍一看似乎不可能不执行。从你所说的来看,它不应该被执行。所以NinjectBindingsModule.Load中的堆栈跟踪会很有趣。 -
@BatteryBackupUnit,同意所有观点。我在
NinjectBindingsModule.Load()的第一行放了一个断点,它永远不会被击中。NinjectWebBindingsModule.Load()中的相同断点被命中。我通过 Find All 进行了三重检查,以查看在解决方案中的任何位置使用NinjectBindingsModule的位置,并且它仅在 Bindings 层和控制台应用程序中使用。这是一个奇怪的。 -
@BatteryBackupUnit,我最好的猜测是 Ninject.Extensions.Conventions 库会扫描它所在的程序集并对所有模块进行处理,但为什么是个谜
标签: c# ninject ninject-extensions ninject-conventions