WCF с бросанием Ninject ArgumentNullException - PullRequest
8 голосов
/ 13 сентября 2010

Я новичок в 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, и ссылки на сервисы разрешаются просто отлично. Интерфейсы и классы реализации действительны. Кажется, проблема возникает, когда фактический экземпляр службы извлекается из контейнера / ядра.

Чего мне не хватает?

Ответы [ 2 ]

6 голосов
/ 05 мая 2011

У меня была такая же проблема, и я обнаружил, что Ядро не было установлено в 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 голосов
/ 15 марта 2016

Мы столкнулись с похожей проблемой регрессии, которая вызвала это исключение (т. Е. Ninject ранее работал, а затем неожиданно выдал:

Не может быть нулевым. Имя параметра: root в Ninject.ResolutionExtensions.GetResolutionIterator.

В конечном итоге это было связано с не связанной ошибкой в ​​некотором коде начальной загрузки ProtoBuf, что, в свою очередь, помешало Ninject правильно загрузить.

Поэтому рекомендуюпри выполнении этого отслеживания вы запускаете свои тестовые наборы для всего следующего:

  • Статические конструкторы и static readonly инициализация элемента
  • Самозагрузка карты AutoMapper
  • Самозагрузка карты сериализации
  • и т. Д.
...