2013-04-03 8 views
8

Ich verwende Ninject für DI und die Ninject.MVC3 Erweiterung innerhalb einer MVC4 App, speziell Version 3.0.0.6.Muss ich Ninject.OnePerRequestModule mit Ninject.Web.MVC 3.0 registrieren?

die documentation auf Ninject Wiki Lesen, scheint es, dass die Lebensdauer von Objekten mit InRequestScope erstellt werden von ASP.NET tatsächlich kontrolliert und richtig aufzuräumen man die OnePerRequest Httpmodule registrieren sollte.

Es sieht jedoch so aus, als wäre dieser Doco nicht mehr aktuell, da type="Ninject.OnePerRequestModule"/> nicht gefunden werden kann.

Auf der anderen Seite las ich einige bits vor kurzem schien, dass NinjectHttpApplication schlägt bereits OnePerRequest vorschlägt.

Meine Frage ist, ob Ninject.Web.MVC 3.0 dieses Problem bereits behandelt oder ob ich das HttpModule noch manuell zu meiner 'web.config' hinzufügen muss.

Ich habe die unten an meine Config und alles hinzugefügt scheint zu funktionieren, obwohl ich überhaupt keine Ahnung, wie zu testen, wenn Objekte zerstört werden:

<system.web> 
    <httpModules> 
     <add name="OnePerRequestModule" type="Ninject.Web.Common.OnePerRequestHttpModule"/> 
    </httpModules> 
    ... 

Muss ich manuell den OnePerRequest hinzufügen HttpModule oder macht Ninject.Web.MVC das für mich?

Antwort

9

Exec Zusammenfassung: Nein, Sie müssen nichts in der web.config tun.

könnten Sie manuell Plausibilitätsprüfung durch:

  • etwas Bindung IDisposable.InRequestScope()
  • es zum Ctor eines Controllers Hinzufügen
  • einen Debugger anbringen, setzen Sie einen Haltepunkt in void Dispose()
  • manuell Auslösung ein

Wenn du die Dispose triffst, war es Ninject, der den Bären erschoss (und du wirst einen Call-Stack haben, um das zu beweisen).

Was verdrahtet es? Die Ninject.Web.Common NuGet Paket fügt:

public static class NinjectWebCommon 
{ 
    public static void Start() 
    { 
     ... 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 

DynamicModuleUtility von Microsoft.Web.Infrastructure ist (und der Anruf an die Start Methode wird von angetriebenen:

[assembly: WebActivator.PreApplicationStartMethod(typeof(App_Start.NinjectWebCommon), "Start")] 

(die sich aus der WebActivator NuGet Paket kommt)


Sprechen pedantisch, the docco sagt sagte:

mehr deterministisches Verhalten zu erhalten, Sie eine der folgenden Möglichkeiten:

  1. ...

  2. Verwenden Sie die Ninject.Web.Common-Erweiterungen, die das OnePerRequestModule für Sie registrieren.

...

Sie können Register

(Hervorhebung von mir). Ich werde es machen explizite ...


BTW zu Beginn der Ausübung der Beantwortung dieser Frage, ich hatte keine besonderen Kenntnisse, nur um die Quelle zu NinjectNinject.Web.Common und einem meiner apps.

+0

Doh! Danke Ruben ... Ich hätte über IDisposable Tests für mich in Erwägung ziehen sollen! Und weißt du, wenn ich die Nacht zuvor nicht 4 Stunden geschlafen hätte, hätte ich die Doco vielleicht richtig gelesen ... Danke für deine Klarstellungen. Viel detaillierter als das Wiki. Danke, dass Sie sich so viel Mühe in die Antwort gesteckt haben. Paul. –

Verwandte Themen