2015-06-16 15 views
19

Ich habe eine MVC 5-Anwendung, die verwendet Ninject und Ich füge Hangfire zu.Hangfire Konfiguration und Ninject Konfiguration

Wenn ich Ninject hinzugefügt habe, habe ich das NinjectWebCommon nugget-Paket wegen seiner Einfachheit in der Konfiguration verwendet. Daher wird Ninject jetzt durch die Klasse NinjectWebCommon konfiguriert, die einen Standardkernel erstellt und die Bindungen hinzufügt.

Außerdem habe ich einige benutzerdefinierte Modul erstellt, die ich laden, wenn der Kernel Erstellung

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; 
    } 
} 

Die Ninject Web Gemeinsame durch die WebActivatorEx Klasse registriert ist

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

Nun ist das Problem bezieht sich auf, wie man Lass Hangfire die Ninject-Konfiguration sehen. Mit Blick auf die Hangfire.Ninject Paket kann ich

Das Paket bietet eine Erweiterungsmethode für IGlobalConfiguration Schnittstelle lesen:

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

Nun meine Frage lautet:

  • Wegen der IGlobalConfiguration Schnittstelle, ich sollte die Hangfire Ninject-Konfiguration innerhalb der OWIN-Startmethode hinzufügen (wo die Hangfire-Konfiguration bereits platziert ist). Wie soll ich den aktuellen Ninject Kernel (die, die NinjectWebCommon konfiguriert?
  • Was ist mit der Reihenfolge der Ausführung? Ist die WebActivatorEx vor oder nach der Inbetriebnahme OWIN Ausführung?
  • Was passiert, wenn ich versuche, die Konfiguration zweimal ausführen
  • ?

Allgemeiner gesagt, wie kann ich die Ninject Konfiguration zwischen den beiden teilen?

Antwort

10

Wie sollte ich die aktuelle Ninject Kernel

Wenn Sie den Code Ninject.Web.Common.Bootstrapper betrachten, wird angezeigt, dass eine einzelne statische Instanz des Kernels gespeichert und über die Eigenschaft Kernel verfügbar gemacht wird. Dies bedeutet, dass Sie diese innerhalb der OWIN Startmethode können:

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

und Sie haben die gleiche IKernel Instanz haben, komplett mit allem, was Bindungen Sie konfiguriert in NinjectWebCommon.RegisterServices

Was ist mit der Reihenfolge der Ausführung ? Wird die WebActivatorEx vor oder nach dem Start von OWIN ausgeführt?

Bevor. Sie können dies (wie ich) überprüfen, indem Sie jeweils Haltepunkte setzen.More info

Allgemeiner, wie kann ich die Ninject-Konfiguration zwischen den beiden teilen?

Was passiert, wenn ich versuche, die Konfiguration zweimal auszuführen?

Die Kernelkonfiguration ist der "Kompositionswurzel". Laut Mark Seemann, einem hervorragenden Experten zu diesem Thema, gibt es should only be one of these in the application und it should be as close as possible to the application's entry point.

+0

Edit: Ersetzt benutzerdefinierte Eigenschaft Vorschlag mit besseren Bootstrapper basierte Vorschlag, und fügte ein bisschen auf Zusammensetzung Wurzeln. – CrazyPyro