2012-05-14 10 views
7

Recentemente, ho aggiornato uno dei miei progetti MVC3 da Ninject 2 a 3. NinjectNinject 3 InRequestScope non restituendo la stessa istanza per la stessa richiesta

Dopo un paio di minuti cercando di trovare il motivo per cui InRequestScope non era più disponibile, Ho scoperto che questa è ora un'estensione di Ninject.Web.Common.

Ora, quando provo a eseguire l'applicazione, Ninject funziona come se tutti i tipi fossero associati con un ambito InRequest sarebbe InTransientScope; una nuova istanza è stata creata ogni volta.

Nella mia classe che eredita da NinjectModule, ho un binding semplice come quella:

Bind<ViewModel.Activity>().ToSelf().InRequestScope(); 

Nel mio controller, ho 2 proprietà del tipo ViewModel.Activity marcati con l'attributo Ninject.

[Inject] 
    public ViewModel.Activity Activity { get; set; } 

    [Inject] 
    public ViewModel.Activity Activity1 { get; set; } 

Se guardavo in modalità debug il valore della HashCode di entrambe le due proprietà, non tutti hanno valore diverso ma HttpContext è lo stesso; Sono nella stessa richiesta.

Cosa mi è mancato su come utilizzare correttamente il nuovo Ninject.Web.Common.InRequestScope con la nuova versione di Ninject 3?

Grazie mille.

+0

Come stai agganciare Ninject nel tuo codice? Stai usando Ninject.MVC3 da nuget e poi modificando il file NinjectWebCommon.cs? o stai facendo una fabbrica di controller personalizzati? –

+0

Una fabbrica personalizzata – Samuel

+0

@MystereMan Grazie mille. Questo è esattamente quello che voglio. Ho usato NuGet per trovare Ninject MVC3 e aggiungo semplicemente quello che hai detto in NinjectWebCommon per il binding delle mie dipendenze e funziona. Penso che la chiave del perché questo lavoro sia dovuto a queste linee: DynamicModuleUtility.RegisterModule (typeof (OnePerRequestHttpModule)); e DynamicModuleUtility.RegisterModule (typeof (NinjectHttpModule)); OnePerRequestHttpModule disporrà immediatamente tutta la mia unità di lavoro dopo ogni richiesta. Grazie mille! – Samuel

risposta

9

Aggiunto come risposta quindi questo può essere chiuso fuori

Non utilizzare una fabbrica personalizzato. Basta installare Ninject.MVC3 e copiare i binding sul file NinjectWebCommon.cs, quindi eliminare tutto il vecchio codice.

+0

Che cos'è questo commento aggiunto all'inizio della risposta? – Samuel

+0

@ Samuel - Inizialmente avevo postato questo come un commento, ma mi hai chiesto di postarlo come risposta in modo che potesse essere contrassegnato come risposta. Così l'ho fatto, e in effetti l'hai contrassegnato come la risposta. Quindi, per qualche motivo, all'improvviso hai deciso di deselezionarlo come risposta. –

+0

Mi dispiace, mio ​​errore. – Samuel

7

Ninject.Web.Common non può essere utilizzato standalone. È necessario utilizzare un'ulteriore estensione web o wcf o implementare InRequestScope autonomamente.

+0

Grazie Remo per il tuo tempo. Avete un esempio di codice su come implementarlo. Nel mio modulo, uso la sintassi di bind per il tipo che desidero essere iniettato e con l'aiuto di un ninject.web.common che uso, richiamo alla fine dell'istruzione di bind il metodo InRequestScope. Non è abbastanza per dire quale obiettivo voglio? – Samuel

+1

No, non è sufficiente, perché InRequestScope può significare InWCFRequestScope o InHttpRequestScope e in futuro anche altri scopi. Web.Common non sa nulla dei vari tipi di richiesta. Consiglio vivamente di utilizzare una delle estensioni Web. Non vi è alcun motivo per implementare le proprie fabbriche e non fornisco alcun supporto su di esse. Guarda le estensioni e copia tutta la logica da lì se vuoi davvero usare la tua fabbrica. –

+0

Ciao Remo, grazie per avermi aiutato. Ho cercato nelle estensioni e in google "InHttpRequestScope" ma non ho trovato alcuna informazione che mi aiutasse ad implementare InHttpRequestScope. In che estensione potrei trovare questo metodo, classe? – Samuel

Problemi correlati