2010-09-13 3 views
7

Je suis nouveau à Ninject et j'essaie d'évaluer à quel point il se compare au château de Windsor, que je connais plus. Mon application est une application de service WCF hébergée dans IIS. Par conséquent, j'essaie de lancer le container/kernel et d'utiliser NinjectServiceHostFactory pour créer ma classe de service, etc. Malheureusement, je reçois une ArgumentNullException à la place.WCF avec lancer Ninject ArgumentNullException

est ici les informations d'exception:

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) 

Et voici le code que je utilise (épurée seulement ce qui est pertinent):

En TheService.svc (pas de code-behind):

<%@ ServiceHost Language="C#" 
       Debug="true" 
       Service="MyServices.TheService" 
       Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" 
       %> 

En Global.asax.cs:

public class Global : NinjectWcfApplication 
{ 
    protected override IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(new ServiceModule()); 
     return kernel; 
    } 
} 

En ServiceModule.cs:

internal class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<ITheService>().To<TheService>(); 
     Bind<ITheRepository>().To<TheRepository>(); 
    } 
} 

Tout ce code semble fonctionner correctement. Je mets quelques diagnostics pour tracer les appels de méthode et la méthode CreateKernel est appelée, suivie par l'appel à la méthode Load dans ServiceModule qui renvoie ensuite CreateKernel renvoie. Cependant, je reçois l'exception ci-dessus lorsque j'essaie d'appeler l'une des méthodes de service dans TheService. J'utilise wsHttpBinding et les références de service résolvent très bien. Les interfaces et les classes d'implémentation sont valides. Il semble que le problème se produise lorsque l'instance de service réelle est récupérée à partir du conteneur/noyau.

Qu'est-ce qui me manque?

+0

Je suggère d'essayer la liste de diffusion - les choses d'usine de WCF ne viennent pas souvent ici. Alternativement, je voudrais que vous pourriez essayer de construire à partir de l'échantillon à la place? (N'ayez pas la source à portée de main pour aller examiner les emplacements dans votre stacktrace et voir ce que cela pourrait signifier en fonction de cela). (J'utilise le truc WCF, mais sans les trucs d'usine) –

+0

La seule chose différente de l'exemple WcfTimeService est que mon implémentation de service n'est pas dans le code derrière le fichier .svc. J'ai envisagé de télécharger la source et de voir si je peux passer à travers pour trouver le problème. J'espérais que je n'aurais pas à traverser le problème. Quelle liste de diffusion? – SonOfPirate

+0

avez-vous déjà trouvé une solution à cela? J'ai le même problème –

Répondre

5

J'ai eu le même problème et a constaté que le noyau n'a pas été définie dans KernelContainer.Kernel (pour la version 2.2 https://github.com/ninject/ninject.extensions.wcf/blob/2.2.0.0/src/Ninject.Extensions.Wcf/KernelContainer.cs) ou (pour la version 2.3 https://github.com/ninject/ninject.extensions.wcf/blob/2.3.0.0/src/Ninject.Extensions.Wcf/NinjectServiceHostFactory.cs) dans NinjectServiceHostFactory.SetKernel(IKernel kernel). Je ne sais pas pourquoi cela n'est pas réglé par magie, mais le réglage dans la méthode CreateKernel() dans Global.asax semble résoudre ce problème.

+0

J'ai trouvé le même problème répondu dans http://stackoverflow.com/questions/5451580/ninject-wcf-extension-argumentnullexception-using-net-tcp-binding –

+0

J'ai actuellement le même problème. J'ai mis à jour mon code pour ressembler à ceci dans mon asax global pour mon projet WCF: protected override IKernel CreateKernel() \t \t { \t \t \t IKernel standardKernel = new StandardKernel (nouveau NinjectModule()); \t \t \t KernelContainer.Kernel = standardKernel; \t \t \t return standardKernel; \t \t} Toutefois, cela modifie l'erreur répertoriée ci-dessus. Pouvez-vous s'il vous plaît signaler s'il me manque quelque chose? – letsgetsilly

0

Nous avons rencontré un problème de régression similaire qui a soulevé cette exception (c.-à-Ninject était auparavant de travail, et puis tout à coup jeté:

ne peut pas être null Nom du paramètre:. Racine à Ninject.ResolutionExtensions.GetResolutionIterator

Il a finalement été suivi d'un bogue non apparenté dans un code d'amorçage de mappage ProtoBuf, ce qui à son tour avait empêché Ninject d'amorcer correctement le jeu.

Donc recommandons que vous exécutez vos suites de tests sur tous les éléments suivants lors du suivi de cette baisse:

  • constructeurs statiques et static readonly initialisation membre
  • AutoMapper carte bootstrapping
  • carte sérialisation bootstrapping
  • etc.