Ninject无法解析我的注册服务

时间:2017-05-07 14:04:46

标签: asp.net-mvc inversion-of-control ninject

我有ASP.NET Mvc应用程序,我在安装this nuget包时集成了Ninject,它更新了我的代码。我在我的解决方案的App_Start文件夹中添加了一个NinjectWebCommon类。我所做的是注册我的一些接口及其实现:

/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
  kernel.Bind<ITokenManager>().To<TokenManager>();
} 

问题在于,当我尝试解析此接口的实例时:

var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());

var tokenManager = kernel.Get<ITokenManager>();

我收到错误。它的意思是:

  

激活ITokenManager时出错没有匹配的绑定可用,并且   该类型不可自我绑定。激活路径:1)请求   ITokenManager

     

建议:1)确保您已为其定义了绑定   ITokenManager。 2)如果在模块中定义了绑定,请确保   模块已加载到内核中。 3)确保你没有   不小心创建了多个内核。 4)如果你正在使用   构造函数参数,确保参数名称匹配   构造函数参数名称。 5)如果您使用的是自动模块   加载,确保搜索路径和过滤器正确无误。

我并不是真的理解它,因为所有教程都以与我完全相同的方式解释配置。

可能是什么原因?

1 个答案:

答案 0 :(得分:1)

在这里,您已经创建了一个新的内核实例:

var kernel = new StandardKernel();

在此指定此内核实例应在当前程序集中查找 modules

kernel.Load(Assembly.GetExecutingAssembly());

在Ninject术语中,模块是实现NinjectModule类的类。例如,您可以添加到当前程序集的类这样的类:

public class WarriorModule : NinjectModule
{
    public override void Load() 
    {
        Bind<ITokenManager>().To<TokenManager>();
    }
}

在你的问题中,你似乎已经展示了一些RegisterServices方法,这个方法在被调用的人以及在什么情况下都很不清楚,但你不可能期望这个方法会被新实例化的内核以某种方式使用

您可能感到困惑,因为此RegisterServices方法在应用程序启动时由程序集属性调用,但请记住,此方法对kernel参数的完全不同的实例进行操作。在您的情况下,您有一个完全不同的实例,您在代码中的某个位置手动创建。因此,如果您希望能够正确解析内核中的依赖关系,请确保这些依赖项已在相同内核实例表单中注册,您希望解析它们。