Я новичок в Ninject и пытаюсь оценить, насколько хорошо он сравнивается с Виндзорским замком, с которым я более знаком. Мое приложение представляет собой приложение службы WCF, размещенное в IIS. В результате я пытаюсь раскрутить контейнер / ядро и использовать 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, за которым следует вызов метода Load в ServiceModule, который возвращает, а затем возвращает CreateKernel. Однако я получаю указанное выше исключение, когда пытаюсь вызвать любой из методов службы в TheService.
Я использую wsHttpBinding, и ссылки на сервисы разрешаются просто отлично. Интерфейсы и классы реализации действительны. Кажется, проблема возникает, когда фактический экземпляр службы извлекается из контейнера / ядра.
Чего мне не хватает?