Dependency injection &引用;加载Ninject组件ICache时出错“;第二次打电话给我的服务
我第一次打电话给我的服务,一切都很好。之后,我收到此错误: “加载Ninject组件ICache时出错\r\n内核的组件容器中没有注册此类组件 我调用的控制器将IKernel作为其构造函数中的参数,我猜这就是问题所在 我应该如何将内核对象传递到我的服务中 我的控制器构造函数:Dependency injection &引用;加载Ninject组件ICache时出错“;第二次打电话给我的服务,dependency-injection,ninject,ninject.web.mvc,Dependency Injection,Ninject,Ninject.web.mvc,我第一次打电话给我的服务,一切都很好。之后,我收到此错误: “加载Ninject组件ICache时出错\r\n内核的组件容器中没有注册此类组件 我调用的控制器将IKernel作为其构造函数中的参数,我猜这就是问题所在 我应该如何将内核对象传递到我的服务中 我的控制器构造函数: public MyController(IKernel diContainer) { _diContainer = diContainer; } 我的Global.asax文件的一部分:
public MyController(IKernel diContainer)
{
_diContainer = diContainer;
}
我的Global.asax文件的一部分:
var kernel = NinjectWebApi.Kernel;
kernel.Bind<IMyController().To<MyController();
//Set the dependency resolver to use ninject
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
var kernel=NinjectWebApi.kernel;
kernel.Bind您似乎在NinjectDependencyResolver dispose方法中处理了容器。您似乎在NinjectDependencyResolver dispose方法中处理了容器。您是否手动编写了NinjectDependencyResolver或使用了一些准备就绪的工具?我现在意识到NinjectDependencyResolver不是现成的对象。这是我的同事制作的东西。这个名字让我觉得它来自ninject本身。这可能值得调查。你是否手动编写了NinjectDependencyResolver或使用了一些现成的东西?我现在意识到NinjectDependencyResolver不是现成的对象。这是我的同事制作的东西。这个名字让我变瘦了它来自ninject本身。这可能值得研究。你的意思是,当控制器被释放时,我的内核也被释放?几乎是正确的。当NinjectDependenvyResolver被释放时,它正在被释放。所以只需删除container.Dispose()
通过它的Dispose
方法,就是这样。你看到这样做有什么危险吗?我猜我的web服务器不会以一堆死掉的内核对象结束?不,内核通常是每个应用程序实例一个,用于在请求之间共享服务。相反,控制器是根据请求创建的。所以这很好。谢谢你你的帮助!你的意思是当控制器被释放时,我的内核也被释放?几乎正确。当NinjectDependenvyResolver被释放时,它正在被释放。所以只需删除container.Dispose()
通过它的Dispose
方法,就是这样。你看到这样做有什么危险吗?我猜我的web服务器不会以一堆死掉的内核对象结束?不,内核通常是每个应用程序实例一个,用于在请求之间共享服务。相反,控制器是根据请求创建的。所以这很好。谢谢你你的帮助!
public class NinjectDependencyScope : IDependencyScope
{
private IResolutionRoot _resolver;
public NinjectDependencyScope(IResolutionRoot resolver)
{
_resolver = resolver;
}
public object GetService(Type serviceType)
{
if (_resolver == null)
{
throw new ObjectDisposedException("this", "This scope has been disposed.");
}
return _resolver.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
if (_resolver == null)
{
throw new ObjectDisposedException("this", "This scope has been disposed.");
}
return _resolver.GetAll(serviceType);
}
public void Dispose()
{
var disposable = _resolver as IDisposable;
disposable?.Dispose();
_resolver = null;
}
}
public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
{
private readonly IKernel _kernel;
public NinjectDependencyResolver(IKernel kernel) : base(kernel)
{
_kernel = kernel;
}
public IDependencyScope BeginScope()
{
return new NinjectDependencyScope(_kernel.BeginBlock());
}
}