2010-09-13 83 views
7

我是Ninject的新手,並試圖評估它與溫莎城堡的比較,我比較熟悉溫莎城堡。我的應用程序是在IIS中託管的WCF服務應用程序。因此,我試圖調整容器/內核並使用NinjectServiceHostFactory創建我的服務類,等等。不幸的是,我得到的是一個ArgumentNullException。WCF與Ninject投擲ArgumentNullException

這裏的異常信息:

System.ArgumentNullException 
Cannot be null. Parameter name: root 

    at Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique) 
    at Ninject.Extensions.Wcf.NinjectInstanceProvider.GetInstance(InstanceContext instanceContext, Message message) in C:\Development\ninject.extensions.wcf\source\Ninject.Extensions.Wcf\NinjectInstanceProvider.cs:line 75 
    at System.ServiceModel.Dispatcher.InstanceBehavior.GetInstance(InstanceContext instanceContext, Message request) 
    at System.ServiceModel.InstanceContext.GetServiceInstance(Message message) 
    at System.ServiceModel.Dispatcher.InstanceBehavior.EnsureServiceInstance(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

這裏是我使用的代碼(簡化到只有客戶的相關):

在TheService.svc(沒有代碼隱藏):

<%@ ServiceHost Language="C#" 
       Debug="true" 
       Service="MyServices.TheService" 
       Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" 
       %> 

在Global.asax.cs中:

public class Global : NinjectWcfApplication 
{ 
    protected override IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(new ServiceModule()); 
     return kernel; 
    } 
} 

在ServiceModule.cs:

internal class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<ITheService>().To<TheService>(); 
     Bind<ITheRepository>().To<TheRepository>(); 
    } 
} 

所有這些代碼的出現很好地工作。我將一些診斷信息用於跟蹤方法調用,並調用CreateKernel方法,然後調用ServiceModule中的Load方法,該方法返回CreateKernel返回值。但是,當我嘗試調用TheService中的任何服務方法時,我會遇到上述異常。

我正在使用wsHttpBinding和服務引用都解決得很好。接口和實現類是有效的。當從容器/內核檢索實際的服務實例時,看起來問題正在發生。

我錯過了什麼?

+0

我建議嘗試郵件列表 - WCF工廠的東西不經常出現在這裏。或者,我可以嘗試從一點一點的樣本中修建? (不要讓源代碼去查看堆棧跟蹤中的位置,並根據它查看它的含義)。 (我使用WCF的東西,但沒有工廠的東西) – 2010-09-14 17:51:36

+0

唯一不同於WcfTimeService示例的是我的服務實現不在.svc文件的代碼隱藏中。我一直在考慮下載源代碼,看看我是否可以一步步找到問題。我希望我不必經歷麻煩。什麼郵件列表? – SonOfPirate 2010-09-14 20:31:35

+0

你有沒有找到解決辦法呢?我有同樣的問題 – 2011-08-03 04:18:00

回答

5

我有同樣的問題,發現內核沒有在KernelContainer.Kernel設置的(2.2版https://github.com/ninject/ninject.extensions.wcf/blob/2.2.0.0/src/Ninject.Extensions.Wcf/KernelContainer.cs)或(2.3版本https://github.com/ninject/ninject.extensions.wcf/blob/2.3.0.0/src/Ninject.Extensions.Wcf/NinjectServiceHostFactory.cs)在NinjectServiceHostFactory.SetKernel(IKernel kernel)。 不知道爲什麼這不是奇蹟般地設置,但將其設置在CreateKernel()方法Global.asax似乎解決它。

+0

發現相同的問題在http://stackoverflow.com/questions/5451580/ninject-wcf-extension-argumentnullexception-using-net-tcp-binding回答 – 2011-05-05 15:34:07

+0

我目前得到了同樣的問題。我已經更新了我的代碼看起來像這樣在我的全球ASAX我的WCF項目: 保護覆蓋的iKernel CreateKernel() \t \t { \t \t \t的iKernel standardKernel =新StandardKernel(新NinjectModule()); \t \t \t KernelContainer.Kernel = standardKernel; \t \t \t return standardKernel; \t \t} 但是,這確實會更改上面列出的錯誤。你能指出我是否錯過了什麼嗎? – letsgetsilly 2012-01-31 17:22:55

0

我們遇到過類似的問題,迴歸其提出了這個異常(即Ninject以前的工作,然後突然拋出:

不能爲空參數名:根在Ninject.ResolutionExtensions.GetResolutionIterator

它最終被追蹤到映射引導代碼的某個ProtoBuf中的無關錯誤,這反過來阻止了Ninject正確引導。

所以建議您在所有的跟蹤這個時候下來以下運行測試套件:

  • 靜態構造函數和static readonly成員初始化
  • AutoMapper地圖引導
  • 序列化映射引導
  • 等。