多个Ninject模块给出奇怪的行为

时间:2015-09-08 09:50:00

标签: c# ninject ninject-extensions ninject-conventions

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

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正在加载或以其他方式扫描引用程序集中的所有模块,并在绑定方面对它们执行某些操作。关于如何解决这个问题的任何想法,而不是每个模块都有一个单独的项目?

1 个答案:

答案 0 :(得分:0)

这篇文章很老,但我想我会在这里发布答案。该问题被证明是Ninject中的一个错误,后来在版本3.2.1中得到修复。使用上面的体系结构用于更高版本的其他解决方案工作得很好并且问题消失了。简而言之,如果可以,请升级Ninject。