0

这个有点复杂,但在我的环境中可以重现。架构如下;

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 正在加载或以其他方式扫描引用程序集中的所有模块,并在绑定方面对它们做一些事情。关于如何在每个模块没有单独项目的情况下解决此问题的任何想法?

4

1 回答 1

0

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

于 2017-09-14T20:45:30.853 回答