我有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)如果您使用的是自动模块 加载,确保搜索路径和过滤器正确无误。
我并不是真的理解它,因为所有教程都以与我完全相同的方式解释配置。
可能是什么原因?
答案 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
参数的完全不同的实例进行操作。在您的情况下,您有一个完全不同的实例,您在代码中的某个位置手动创建。因此,如果您希望能够正确解析内核中的依赖关系,请确保这些依赖项已在相同内核实例表单中注册,您希望解析它们。