2016-12-12 29 views
0

第一次我打電話給我的服務一切正常。從那以後,我收到此錯誤: 「錯誤加載Ninject組件ICACHE \ r \ n沒有這樣的組件已經在內核中的組件容器註冊「加載Ninject組件ICache時出錯」第二次給我打電話我的服務

我打電話控制器具有的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); 

我正在使用Ninject 3.2。

對於我沒有將內核傳遞給服務的其他服務,此方法正常工作。

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

你有沒有手動編寫NinjectDependencyResolver或使用了一些準備好的東西? –

+0

我現在意識到NinjectDependencyResolver不是一個開箱即用的對象。這是我的同事所做的。這個名字讓我覺得它來自ninject本身。這可能值得調查。 – jimmy

回答

2

看來你把容器放在你的NinjectDependenvyResolver Dispose方法中。

+0

你的意思是說,當處置控制器時,我的內核也被丟棄了? – jimmy

+1

幾乎正確。 NinjectDependenvyResolver正在配置時處理。所以只需從'Dispose'方法中移除'container.Dispose()',就是這樣了 –

+0

你有沒有看到這樣做的危險?我在猜測我的Web服務器不會以一堆死的內核對象結束? – jimmy

相關問題