我对ninject很新,我只是按照一些教程并将代码添加到我的asp.net mvc 4项目中,然后我注意到ninject找不到任何自己的源代码。它一直在问我所有源文件的位置。我不确定发生了什么。
编辑:即使我安装了mvc 3 ninject包,我仍然会遇到同样的问题。它会打开一个filedialog,让我选择ninject类文件的位置。
已安装的物品:
我的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,但事实并非如此。
答案 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
。