2010-09-13 10 views
7

Sono nuovo di Ninject e sto cercando di valutare quanto sia paragonabile a Windsor Castle, con cui sono più familiare. La mia applicazione è un'applicazione di servizio WCF ospitata in IIS. Di conseguenza, sto cercando di avviare il contenitore/kernel e utilizzare NinjectServiceHostFactory per creare la mia classe di servizio, ecc. Sfortunatamente, sto ricevendo invece ArgumentNullException.WCF con lancio di Ninject ArgumentNullException

Ecco le informazioni eccezione:

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) 

Ed ecco il codice che sto usando (abita in fondo a solo ciò che è rilevante):

In TheService.svc (senza code-behind):

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

In Global.asax.cs:

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

In ServiceModule.cs:

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

Tutto questo codice sembra funzionare bene. Metto un po 'di diagnostica per tracciare le chiamate al metodo e viene chiamato il metodo CreateKernel, seguito dalla chiamata al metodo Load in ServiceModule che restituisce quindi i ritorni di CreateKernel. Tuttavia, ottengo l'eccezione di cui sopra quando provo a chiamare uno dei metodi di servizio in TheService.

Sto usando wsHttpBinding ei riferimenti di servizio si risolvono tutti bene. Le interfacce e le classi di implementazione sono valide. Sembra che il problema si verifichi quando l'effettiva istanza di servizio viene recuperata dal contenitore/kernel.

Cosa mi manca?

+0

Suggerirei di provare la mailing list - la roba di fabbrica della WCF non compare spesso qui. In alternativa, potrei provare a costruire dall'esempio una volta alla volta? (Non avere la fonte per andare ad esaminare le posizioni nel tuo stacktrace e vedere cosa potrebbe significare in base a questo). (Io uso le cose WCF, ma senza le cose di fabbrica) –

+0

L'unica cosa diversa dall'esempio WcfTimeService è che l'implementazione del mio servizio non è nel code-behind del file .svc. Stavo pensando di scaricare la fonte e vedere se posso passare attraverso per trovare il problema. Speravo che non avrei dovuto affrontare il problema. Quale mailing list? – SonOfPirate

+0

hai mai trovato una soluzione a questo? Ho lo stesso problema –

risposta

5

Ho avuto lo stesso problema e ha scoperto che il kernel non è stato messo in KernelContainer.Kernel (per la versione 2.2 https://github.com/ninject/ninject.extensions.wcf/blob/2.2.0.0/src/Ninject.Extensions.Wcf/KernelContainer.cs) o (per la versione 2.3 https://github.com/ninject/ninject.extensions.wcf/blob/2.3.0.0/src/Ninject.Extensions.Wcf/NinjectServiceHostFactory.cs) in NinjectServiceHostFactory.SetKernel(IKernel kernel). Non so perché questo non sia magicamente impostato, ma impostarlo nel metodo in Global.asax sembra risolvere il problema.

+0

Trovato lo stesso problema risposto in http://stackoverflow.com/questions/5451580/ninject-wcf-extension-argumentnullexception-using-net-tcp-binding –

+0

Attualmente ho lo stesso problema. Ho aggiornato il mio codice a guardare come questo nel mio ASax globale per il mio progetto WCF: protected override Ikernel CreateKernel() \t \t { \t \t \t Ikernel standardKernel = new StandardKernel (nuova NinjectModule()); \t \t \t KernelContainer.Kernel = standardKernel; \t \t \t standard di ritorno kernel; \t \t} Tuttavia, questo modifica l'errore sopra elencato. Puoi per favore indicare se mi manca qualcosa? – letsgetsilly

0

abbiamo incontrato un problema di regressione simile che ha sollevato questa eccezione (cioè Ninject precedentemente lavorare, e poi improvvisamente ha gettato:

non può essere nullo Nome parametro:. Root al Ninject.ResolutionExtensions.GetResolutionIterator

È stato rintracciato in un errore non correlato in alcuni codici di bootstrap di mappatura , che a loro volta avevano impedito il corretto avvio di Ninject

Quindi vi consiglio di eseguire le suite di test su tutti i seguenti durante l'inseguimento di questo in giù:

  • costruttori statici e static readonly inizializzazione membro
  • automapper mappa bootstrapping
  • serializzazione mappa bootstrapping
  • etc.
Problemi correlati