Dependency injection &引用;加载Ninject组件ICache时出错“;第二次打电话给我的服务

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文件的一部分:

我第一次打电话给我的服务,一切都很好。之后,我收到此错误: “加载Ninject组件ICache时出错\r\n内核的组件容器中没有注册此类组件

我调用的控制器将IKernel作为其构造函数中的参数,我猜这就是问题所在

我应该如何将内核对象传递到我的服务中

我的控制器构造函数:

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());
    }
}