2010-09-02 6 views
2

J'ai la HttpHandler suivante:HttpHandler Injection de propriétés à l'aide Ninject retour null

public class NewHandler : IHttpHandler 
{ 
    [Inject] 
    public IFile FileReader 
    { 
     get; 
     set; 
    } 

    public NewHandler() 
    { 
    } 

    public void ProcessRequest(System.Web.HttpContext context) 
    { 
     .... 
     var something = SomeMethod(FileReader); 
     .... 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 
} 

Ceci est mon Ninject module dans le Global.asax.

internal class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IFile>().To<FileWrapper>().InSingletonScope(); 
    } 
} 

Chaque fois que le gestionnaire se déclenche, FileReader est NULL. Est-ce que je manque quelque chose? Est-ce la bonne façon de faire une injection de propriété en utilisant Ninject?

Merci

Répondre

3

Ceci est la bonne façon de faire l'injection de propriété avec Ninject, mais il ne fonctionnera pas. Vous utilisez probablement une classe NinjectMvcApplication comme classe de base pour votre application, qui gère l'injection de dépendances pour les contrôleurs et tout ce que les contrôleurs peuvent utiliser (services, référentiels). Mais HttpHandlers ne sont pas instanciés par le ControllerFactory donc rien ne prend soin d'injecter des choses.

Peut-être qu'il y a une meilleure façon de le faire, mais j'ai utilisé le localisateur de service pour résoudre la dépendance. Voir http://code.dortikum.net/2010/08/05/asp-net-mvc-di-with-common-service-locator-and-ninject/.

MISE À JOUR:

Essayez quelque chose comme ceci:

public class NewHandler : IHttpHandler 
{ 
    private readonly IFile _fileReader; 

    public NewHandler() 
    { 
     _fileReader = ServiceLocator.Current.GetInstance<IFile>(); 
    } 

    public void ProcessRequest(System.Web.HttpContext context) 
    { 
     .... 
     var something = SomeMethod(_fileReader); 
     .... 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 
} 
+0

Merci! J'ai lu l'article, intéressant. Juste pour l'essayer j'ai modifié mon application en conséquence mais je réussis toujours à obtenir la valeur NULL dans la propriété FileReader quand le ProcessRequest se déclenche. – Thomas

+0

@Thomas - voir ma mise à jour – Necros

+0

Oui, cette approche fonctionne. Toujours curieux de savoir pourquoi httphandlers ne peut pas faire des injections de propriété de la même manière qu'un contrôleur peut. Probablement quelque chose à faire avec le pipeline de demande. Si quelqu'un sait s'il vous plaît faites le moi savoir. Necros, merci encore !! – Thomas

Questions connexes