【问题标题】:WCF with Ninject throwing ArgumentNullExceptionWCF 与 Ninject 抛出 ArgumentNullException
【发布时间】:2010-09-13 19:56:28
【问题描述】:

我是 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 并且服务引用都解决得很好。接口和实现类是有效的。从容器/内核中检索实际服务实例时,似乎出现了问题。

我错过了什么?

【问题讨论】:

  • 我建议尝试邮件列表 - WCF 工厂的东西不会经常出现在这里。或者,我希望您可以尝试从示例中一点一点地构建? (没有手头的资源去检查堆栈跟踪中的位置,看看它可能意味着什么)。 (我使用 WCF 的东西,但没有工厂的东西)
  • 与 WcfTimeService 示例唯一不同的是我的服务实现不在 .svc 文件的代码隐藏中。我一直在考虑下载源代码并查看是否可以逐步找到问题。我希望我不必经历这些麻烦。什么邮件列表?
  • 您找到解决方案了吗?我有同样的问题

标签: wcf ninject


【解决方案1】:

我遇到了同样的问题,发现NinjectServiceHostFactory.SetKernel(IKernel kernel)中的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)没有设置内核。 不知道为什么没有神奇地设置它,但是在Global.asaxCreateKernel() 方法中设置它似乎可以解决它。

【讨论】:

  • 发现stackoverflow.com/questions/5451580/…中回答了同样的问题
  • 我目前遇到了同样的问题。我已经在我的 WCF 项目的全局 asax 中更新了我的代码,如下所示: protected override IKernel CreateKernel() { IKernel standardKernel = new StandardKernel(new NinjectModule()); KernelContainer.Kernel = 标准内核;返回标准内核;但是,这确实会改变上面列出的错误。你能指出我是否遗漏了什么吗?
【解决方案2】:

我们遇到了类似的回归问题,它引发了这个异常(即 Ninject 以前工作,然后突然抛出:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多