【问题标题】:Ninject can't find any sourcesNinject 找不到任何来源
【发布时间】:2026-01-11 15:35:01
【问题描述】:

我对 ninject 还很陌生,我只是在学习一些教程并将代码添加到我的 asp.net mvc 4 项目中,然后我注意到 ninject 找不到任何自身的来源。它一直问我所有源文件的位置。我不确定发生了什么。

编辑:即使我安装了 mvc 3 ninject 包,我仍然遇到同样的问题。它会打开一个文件对话框,让我选择 ninject 的类文件所在的位置。

已安装项目:

  • Ninject - ioC 容器
  • Ninject - Ninject.Web.Common

我的 NinjectDependencyResolver 类:

public class NinjectDependencyResolver : System.Web.Mvc.IDependencyResolver
{
    private IKernel kernel;

    public NinjectDependencyResolver()
    {
        kernel = new StandardKernel();
        AddBindings();
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    public object GetService(Type serviceType)
    {
        return kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return kernel.GetAll(serviceType);
    }

    public IDependencyScope BeginScope()
    {
        throw new NotImplementedException();
    }

    private void AddBindings()
    {
        kernel.Bind<IEmail>().To<Classes.Email.MockEmail>();
    }
}

Application_Start:

//Ninject
DependencyResolver.SetResolver(new NinjectDependencyResolver());

来源搜索信息(错误):

查找来源 'c:\Projects\Ninject\ninject\src\Ninject\Syntax\BindingRoot.cs'。 校验和:MD5 {25 92 2 2e 84 42 6d 8a d5 64 6 3a 18 a8 75 cf} 文件 'c:\Projects\Ninject\ninject\src\Ninject\Syntax\BindingRoot.cs' 确实 不存在。在脚本文档中查找 'c:\Projects\Ninject\ninject\src\Ninject\Syntax\BindingRoot.cs'... 在项目中寻找 'c:\Projects\Ninject\ninject\src\Ninject\Syntax\BindingRoot.cs'。这 在项目中找不到文件。查看目录'C:\ Program 文件 (x86)\Microsoft Visual Studio 12.0\VC\crt\src\'... 查看 目录 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src\vccorlib\'... 查看目录 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\mfc\'... 查看 目录 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\atl\'... 查看目录 'C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include'... 调试 活动解决方案的源文件设置表明 调试器不会要求用户查找文件: c:\Projects\Ninject\ninject\src\Ninject\Syntax\BindingRoot.cs。这 调试器找不到源文件 'c:\Projects\Ninject\ninject\src\Ninject\Syntax\BindingRoot.cs'。

在我的一个控制器中,我有这个:

IEmail Email = new Email();
Email.SendEmail("", "", "", true);

所以 ninject 应该将新的电子邮件更改为新的 MockEmail,但它没有。

【问题讨论】:

  • @hutchonoid 即使我为 mvc 3 安装该软件包,我仍然遇到同样的问题。
  • 什么是消息/异常+消息/堆栈跟踪?
  • 如果你将包安装为 Install-package Ninject.MVC3,你应该有一个 Ninject.MVC3 包。是这样吗?
  • 你想做什么? Ninject 是否抛出异常并抱怨找不到源代码文件以进行调试?我不确定 Ninject 包是否包含 pdb 文件。
  • @hutchonoid 是的,我有这个包,安装总是成功的。解雇,它没有抛出任何异常,只是打开一个文件对话框来选择一个 ninject 的类文件。我很确定该软件包已包含让 ninject 工作的所有内容?

标签: c# asp.net asp.net-mvc dependency-injection ninject


【解决方案1】:

每当您使用new 运算符时,您都在绕过依赖注入容器。 您可以使用构造函数、属性、方法注入(https://github.com/ninject/ninject/wiki/Injection-Patterns)或指示容器为您实例化IEMailIResolutionRoot.Get&lt;IEMail&gt;()

我建议你如下调整你的控制器:

public class Controller {

    private readonly IResolutionRoot resolutionRoot;

    public Controller(IResolutionRoot resolutionRoot) {
        this.resolutionRoot = resolutionRoot;
    }

    public void SendEmail() {
        this.resolutionRoot.Get<IEmail>().Send();
    }
}

除了使用IResolutionRoot,您还可以使用ninject.extensions.factory,然后将Func&lt;IEmail&gt; emailFactory注入控制器的构造函数中。

【讨论】: