Reputation: 2031
First time I call my service everything works fine. After that I receive this error: "Error loading Ninject component ICache\r\nNo such component has been registered in the kernel's component container.
The controller I am calling has IKernel as a parameter in its constructor and my guess is that this is the problem.
How am i supposed to pass a kernel object into my service?
My controller constructor:
public MyController(IKernel diContainer)
{
_diContainer = diContainer;
}
Part of my Global.asax file:
var kernel = NinjectWebApi.Kernel;
kernel.Bind<IMyController().To<MyController();
//Set the dependency resolver to use ninject
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
I am using Ninject 3.2.
For my other services where I am not passing in the Kernel to the service this approach works fine.
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());
}
}
Upvotes: 1
Views: 767
Reputation: 549
It seems you dispose container inside your NinjectDependenvyResolver Dispose method.
Upvotes: 4