我是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)
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的代码(仅限于相关的代码):
在TheService.svc中(没有代码隐藏):
<%@ ServiceHost Language="C#"
Debug="true"
Service="MyServices.TheService"
Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"
%>
Run Code Online (Sandbox Code Playgroud)
在Global.asax.cs中:
public class Global : NinjectWcfApplication
{
protected override IKernel CreateKernel()
{
var kernel = new StandardKernel(new ServiceModule());
return kernel;
}
}
Run Code Online (Sandbox Code Playgroud)
在ServiceModule.cs中:
internal class ServiceModule : NinjectModule
{
public override void Load()
{
Bind<ITheService>().To<TheService>();
Bind<ITheRepository>().To<TheRepository>();
}
}
Run Code Online (Sandbox Code Playgroud)
所有这些代码似乎都运行正常.我进行了一些诊断以跟踪方法调用并调用CreateKernel方法,然后调用ServiceModule中的Load方法,然后返回CreateKernel返回.但是,当我尝试调用TheService中的任何服务方法时,我得到上述异常.
我正在使用wsHttpBinding和服务引用都解决得很好.接口和实现类是有效的.当从容器/内核检索实际服务实例时,似乎发生了问题.
我错过了什么?
我遇到了同样的问题,发现内核没有设置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
似乎解决了它.