2012-04-12 6 views
0

Ich habe ein ASP.NET MVC 3-Projekt mit Ninject (NuGet installieren). Ich versuche zu verstehen, wie ich damit Abhängigkeiten in Nicht-MVC-Objekte injizieren kann.Verwendung von Ninject in einer ASP.NET MVC-Anwendung für Nicht-MVC-Objekte

Ich habe einen Code, der ähnlich wie folgt aussieht. Wie kann ich Ninject verwenden, um eine konkrete Instanz von IStore in dem Objekt darunter zu erhalten?

public class SomeObject 
{ 
    private static IStore _store; 

    public static IStore CurrentStore 
    { 
     get 
     { 
      if (_store == null) 
      { 
       // Get Instance of _store. 
      } 
      return _store; 
     } 
    } 
} 

In Global.asax:

protected Application_BeginRequest() 
{ 
    IStore store = SomeObject.CurrentStore; 
} 

In NinjectWebCommon.cs:

private static void RegisterServices(IKernel kernel) 
    { 
     // Module that binds a concrete type of IStore. 
     kernel.Load<WebModule>(); 
    } 

Antwort

1

Für Anfrage die einfachste Art und Weise der Handhabung ist es nicht in der global.asax zu tun, sondern in einem IHttpModul. Dort können Sie die Abhängigkeiten als Konstruktorargumente nehmen, wenn Sie eine Bindung für das Httpmodule hinzufügen:

Bind<IHttpModule>().To<MyHttpModule>(); 
+0

Diese Methode funktioniert gut, außer es bedeutet, dass ich _store für null überprüfen muss und legen Sie den Wert in meinem Modul, die für jede Anfrage ausgeführt wird. Gibt es einen saubereren Weg? –

0

Es sieht aus wie diese die Grenze zwischen App DI-Container & Web verwirrt.

Was Sie wahrscheinlich brauchen, ist eine Klasse, um das Geschäft abzurufen. Diese Klasse kann dann entscheiden, von wo der Speicher tatsächlich abgerufen werden soll. Es hätte auch die Initialisierungsroutine, die beim Start aufgerufen werden könnte.

Auf diese Weise erhält Ihr Ninject-Modul keinen Web-App-Code, Sie können konfigurieren, wie der Store basierend auf dem Kontext geladen wird (zB kann das Testen von der Produktion abweichen).