Ninject无法找到任何来源

时间:2014-02-13 13:04:01

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

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

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

已安装的物品:

  • Ninject - ioC Container
  • 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:\项目\ Ninject \ ninject的\ src \ Ninject \语法\ 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:\项目\ Ninject \ ninject的\ src \ Ninject \语法\ BindingRoot.cs' ...   在项目中寻找   'C:\项目\ Ninject \ ninject的\ src \ Ninject \语法\ 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:\项目\ Ninject \ ninject的\ src \ Ninject \语法\ BindingRoot.cs。该   调试器无法找到源文件   'C:\项目\ Ninject \ ninject \ SRC \ Ninject \语法\ BindingRoot.cs'。

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

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

所以ninject应该将新的电子邮件更改为新的MockEmail,但事实并非如此。

1 个答案:

答案 0 :(得分:0)

每当您使用new运算符时,您都会绕过依赖注入容器。 您可以使用构造函数,属性,方法注入(https://github.com/ninject/ninject/wiki/Injection-Patterns)或指示容器为您实现IEMail IResolutionRoot.Get<IEMail>()

我建议您调整控制器,如下所示:

public class Controller {

    private readonly IResolutionRoot resolutionRoot;

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

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

您可以使用ninject.extensions.factory,然后将IResolutionRoot注入控制器的构造函数中,而不是使用Func<IEmail> emailFactory