2015-06-16 34 views
19

Possiedo un'applicazione MVC 5 che utilizza Ninject e aggiungo Hangfire ad esso.Configurazione Hangfire e configurazione Ninject

Quando ho aggiunto Ninject, ho utilizzato il pacchetto nuget NinjectWebCommon per la sua semplicità nella configurazione. Quindi per ora Ninject è configurato attraverso la classe NinjectWebCommon che crea un kernel standard e aggiunge i binding.

Inoltre ho creato qualche modulo personalizzato che si carica durante la creazione del kernel

private static IKernel CreateKernel() { 
    var kernel = new StandardKernel(new MyCustomModule()); 
    try { 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

     RegisterServices(kernel); 
     return kernel; 
    } 
    catch { 
     kernel.Dispose(); 
     throw; 
    } 
} 

Il Ninject Web Common è registrato attraverso la classe WebActivatorEx

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(MyProject.Web.NinjectWebCommon), "Start")] 
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(MyProject.Web.NinjectWebCommon), "Stop")] 

Ora il problema è legato su come rendere Hangfire per vedere la configurazione di Ninject. Osservando il pacchetto Hangfire.Ninject posso leggere

Il pacchetto fornisce un metodo di estensione per IGlobalConfiguration interfaccia :

var kernel = new StandardKernel(); GlobalConfiguration.Configuration.UseNinjectActivator(kernel);

Ora la mia domanda sono:

  • A causa dell'interfaccia IGlobalConfiguration, I aggiungere la configurazione di Hangfire Ninject all'interno del metodo di avvio di OWIN (dove è già posizionata la configurazione di Hangfire). Come dovrei ottenere la corrente Ninject kernel (quella che NinjectWebCommon ha configurato?
  • cosa circa l'ordine di esecuzione? È il WebActivatorEx esecuzione prima o dopo l'avvio OWIN?
  • Che cosa accade se provo ad eseguire la configurazione due volte ?

Più in generale, come posso condividere la configurazione Ninject tra i due?

risposta

10

Come devo ottenere la corrente Ninject kernel

Guardando il codice di Ninject.Web.Common.Bootstrapper viene mostrato che memorizza una singola istanza statica del kernel e la espone tramite la proprietà Kernel. Questo significa che si può fare questo all'interno del metodo di avvio OWIN:

GlobalConfiguration.Configuration.UseNinjectActivator(
            new Ninject.Web.Common.Bootstrapper().Kernel); 

e avrete la stessa IKernel esempio, completo di tutto ciò che attacchi si è configurato in NinjectWebCommon.RegisterServices

cosa circa l'ordine di esecuzione ? L'esecuzione di WebActivatorEx prima o dopo l'avvio di OWIN?

Prima. È possibile verificare questo (come ho fatto) impostando i punti di interruzione in ciascuno.More info

Più in generale, come posso condividere la configurazione di Ninject tra i due?

Cosa succede se provo a eseguire la configurazione due volte?

La configurazione del kernel è la "radice di composizione". Secondo Mark Seemann, un esperto eminente sull'argomento, ci sono should only be one of these in the application e it should be as close as possible to the application's entry point.

+0

Modifica: suggerimento di proprietà personalizzate sostituito con un suggerimento basato su Bootstrapper migliore e aggiunto un po 'alle radici di composizione. – CrazyPyro