Ninject 没有解析我注册的服务

Ninject does not resolve my registered services

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

/// <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>();

我收到一个错误。它说的是:

Error activating ITokenManager No matching bindings are available, and the type is not self-bindable. Activation path: 1) Request for ITokenManager

Suggestions: 1) Ensure that you have defined a binding for ITokenManager. 2) If the binding was defined in a module, ensure that the module has been loaded into the kernel. 3) Ensure you have not accidentally created more than one kernel. 4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name. 5) If you are using automatic module loading, ensure the search path and filters are correct.

我不太明白,因为所有教程都以与我完全相同的方式解释配置。

可能是什么原因?

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

var kernel = new StandardKernel();

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

kernel.Load(Assembly.GetExecutingAssembly());

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

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

在您的问题中,您似乎只是展示了一些 RegisterServices 方法,该方法非常不清楚它是由谁调用的,在什么情况下调用的,但是您不可能期望您的新手会以某种方式使用该方法实例化内核。

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