WCF与Ninject抛出ArgumentNullException

时间:2010-09-13 19:56:29

标签: wcf ninject

我是Ninject的新手,并试图评估它与温莎城堡的比较,我对此更为熟悉。我的应用程序是IIS中托管的WCF服务应用程序。因此,我试图启动容器/内核并使用NinjectServiceHostFactory来创建我的服务类,等等。不幸的是,我得到了一个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,服务引用都解析得很好。接口和实现类是有效的。当从容器/内核检索实际服务实例时,似乎发生了问题。

我错过了什么?

2 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,发现内核未在KernelContainer.Kernel中设置NinjectServiceHostFactory.SetKernel(IKernel 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.csCreateKernel()。 不确定为什么这不是神奇的设置,但在Global.asax中的{{1}}方法中进行设置似乎可以解决它。

答案 1 :(得分:0)

我们遇到了一个类似的回归问题,引发了这个例外(即Ninject之前有效,然后突然抛出:

  

不能为空。参数名称:Ninject.ResolutionExtensions.GetResolutionIterator

中的root

它最终被追踪到某些ProtoBuf映射引导代码中的一个不相关的错误,这反过来阻止了Ninject正确引导。

因此,建议您在跟踪此问题时运行以下所有测试套件:

  • 静态构造函数和static readonly成员初始化
  • AutoMapper map bootstrapping
  • 序列化地图引导