【问题标题】:Multiple Ninject Modules giving odd behaviour多个 Ninject 模块给出奇怪的行为
【发布时间】: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


【解决方案1】:

这篇文章很旧,但我想我会在这里发布答案。这个问题原来是 Ninject 中的一个错误,后来在 3.2.1 版本中得到了修复。将上述体系结构用于具有更高版本的其他解决方案工作得很好,问题消失了。简而言之,如果可以的话,升级 Ninject。

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 2022-11-14
    • 2021-11-08
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多