2011-01-06 6 views
2

Ich habe folgende NinjectModule, wo wir unsere Repositories und Business-Objekte binden:Ein Controller Manchmal Bound zweimal mit Ninject

/// <summary> 
/// Used by Ninject to bind interface contracts to concrete types. 
/// </summary> 
public class ServiceModule : NinjectModule 
{ 
    /// <summary> 
    /// Loads this instance. 
    /// </summary> 
    public override void Load() 
    { 
     //bindings here. 
     //Bind<IMyInterface>().To<MyImplementation>(); 
     Bind<IUserRepository>().To<SqlUserRepository>(); 
     Bind<IHomeRepository>().To<SqlHomeRepository>(); 
     Bind<IPhotoRepository>().To<SqlPhotoRepository>(); 
     //and so on 

     //business objects 
     Bind<IUser>().To<Data.User>(); 
     Bind<IHome>().To<Data.Home>(); 
     Bind<IPhoto>().To<Data.Photo>(); 
     //and so on 
    } 
} 

Und hier sind die entsprechenden Überschreibungen von unserem Global.asax, wo wir von NinjectHttpApplication erben um es mit Asp.Net Mvc (Das Modul befindet sich in einer separaten dLL namens Thing.Web.Configuration) zu integrieren:

protected override void OnApplicationStarted() 
    { 
     base.OnApplicationStarted(); 

     //routes and areas 
     AreaRegistration.RegisterAllAreas(); 

     RegisterRoutes(RouteTable.Routes); 

     //Initializes a singleton that must reference this HttpApplication class, 
     //in order to provide the Ninject Kernel to the rest of Thing.Web. This 
     //is necessary because there are a few instances (currently Membership) 
     //that require manual dependency injection. 
     NinjectKernel.Instance = new NinjectKernel(this); 

     //view model factory. 
     NinjectKernel.Instance.Kernel.Bind<IModelFactory>().To<MasterModelFactory>(); 
    } 

    protected override NinjectControllerFactory CreateControllerFactory() 
    { 
     return base.CreateControllerFactory(); 
    } 

    protected override Ninject.IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     kernel.Load("Thing.Web.Configuration.dll"); 
     return kernel; 
    } 

Nun ist alles toll, mit einer Ausnahme funktioniert: Aus irgendeinem Grund, manchmal Ninject bindet das PhotoC Ontroller zweimal. Dies führt zu einer ActivationException, weil Ninject nicht erkennen kann, welchen PhotoController ich möchte. Dies führt dazu, dass alle Anforderungen für Thumbnails und andere Benutzerimages auf der Site fehlschlagen. Hier

ist der Photocontroller in seiner Gesamtheit:

public class PhotoController : Controller 
{ 
    public PhotoController() 
    { 

    } 

    public ActionResult Index(string id) 
    { 
     var dir = Server.MapPath("~/" + ConfigurationManager.AppSettings["UserPhotos"]); 
     var path = Path.Combine(dir, id); 

     return base.File(path, "image/jpeg"); 
    } 
} 

Jeder Controller auf genau die gleiche Art und Weise funktioniert, aber aus irgendeinem Grunde die Photocontroller bekommen doppelt gebunden. Selbst dann kommt es nur gelegentlich vor (entweder beim Neuaufbau der Lösung oder bei der Bereitstellung/Produktion, wenn der App-Pool einsetzt). Sobald dies passiert, passiert es weiterhin, bis ich es neu implementiere, ohne etwas zu ändern.

Also ... was ist los?

+0

Niemals den Grund dafür gefunden. Ich ersetzte schließlich diese Methode des Zugriffs auf Bilder mit einem generischen Handler, der Inhalte aus dem Azure Blob-Speicher bereitstellt. – Dusda

+0

Ich habe jedoch eine Theorie. Dies war bei allen Steuerungsaktionen der Anwendung bei weitem am aktivsten. Da es Bilder verarbeitet, wird die Controller-Aktion 15 bis 30 Mal pro Seite geladen. Das oben beschriebene Verhalten impliziert eine mögliche Wettlaufsituation. – Dusda

Antwort

2

Wie in den Kommentaren von your answer to another similar question erwähnt, war dies ein Race Condition Bug in Ninject 2.0, der in Version 2.2 behoben wurde. Ich kann keine Versionshinweise für Ninject finden, aber es löste genau dieses Problem für mich.

+0

das ist sehr hilfreich, haben Sie eine Idee, wann dieses Update möglicherweise begangen wurde? –

+2

wegen google, hier ist das Commit, das das Problem behebt: https://github.com/ninject/ninject/blob/a57a8879d23763f9fb2c272609a554f02350cd8d/src/Ninject/KernelBase.cs –

Verwandte Themen