多个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模块给出奇怪的行为

这是一个旧的帖子,但我想我把答案贴在这里。这个问题原来是Ninject的一个bug,后来在3.2.1版本中修复了。将上面的架构用于其他解决方案的后续版本工作得很好,问题消失了。简而言之,如果可以的话,升级Ninject。