6

J'ai une application ASP.NET MVC avec un simple NinjectModule:Erreur activation HttpContext - Plus d'un correspondant de liaison est disponible

public class MainModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<AppSettings>().ToSelf().InSingletonScope(); 
     Bind<HttpContext>().ToMethod(context => HttpContext.Current); // <-- problem 
     Bind<MainDbContext>().ToSelf().InRequestScope(); 
     Bind<UserInfo>().ToSelf().InRequestScope(); 
    } 
} 

C'est le seul code de liaison dans mon application ensemble. Quand je lance mon application, je reçois immédiatement cette erreur d'exécution:

Error activating HttpContext
More than one matching bindings are available.
Activation path:
3) Injection of dependency HttpContext into parameter httpContext of constructor of type UserInfo
2) Injection of dependency UserInfo into parameter userInfo of constructor of type HomeController
1) Request for HomeController

Suggestions:
1) Ensure that you have defined a binding for HttpContext only once.

Le message d'erreur semble dire que je l'ai défini le HttpContext liant plus d'une fois, mais les seules déclarations de liaison dans l'ensemble de l'application sont en MainModule, et j'ai clairement défini seulement une liaison pour HttpContext. Si je commente cette ligne de code, j'arrête d'obtenir l'erreur, mais le HttpContext qui est injecté n'est pas correct (il s'agit d'un HttpContext nouvellement instancié, plutôt que).

Le message d'erreur décrit bien la séquence d'injection exacte j'attendre de se produire ...

HttpContext devrait obtenir injecté dans le constructeur de UserInfo, qui ressemble à ceci:

public class UserInfo 
{ 
    private readonly HttpContext _httpContext; 

    public UserInfo(HttpContext httpContext) 
    { 
     _httpContext = httpContext; 
    } 

    // ... etc ... // 
} 

Et UserInfo devrait être injecté dans le constructeur de HomeController, qui ressemble à ceci:

public class HomeController : Controller 
{ 
    private readonly AppSettings _appSettings; 
    private readonly UserInfo _userInfo; 

    public HomeController(AppSettings appSettings, UserInfo userInfo) 
    { 
     _appSettings = appSettings; 
     _userInfo = userInfo; 
     ViewData[Token.AppSettings] = _appSettings; 
     ViewData[Token.UserInfo] = _userInfo; 
    } 

    // ... actions here ... // 
} 

Pourquoi cela entraîne-t-il une erreur? Cela ressemble à un scénario d'injection de dépendance très simple. De quelle manière suis-je en train de définir la liaison pour HttpContext plus d'une fois?

+0

Vous nous avez montré le module principal. Vous n'avez pas dit si vous utilisez Ninject.Web.MVC3 et/ou où votre noyau est créé. L'erreur suggère fortement que vous exécutez les charges de module dans un seul noyau plus d'une fois, par ex. en le déclenchant dans votre construction 'Global' /' HttpApplication'/start (dont il y a presque toujours> 1). –

Répondre

5

Si vous utilisez l'extension Ninject.MVC3 que vous devez supprimer

Bind<HttpContext>().ToMethod(context => HttpContext.Current); // <-- problem 

parce que le HttpContext la liaison est déjà ajoutée par l'extension.

+0

Oui, j'utilise le paquet nuget Ninject.MVC3, et vous avez raison, l'élimination de cette liaison résout le problème. À l'origine, je pensais que j'obtenais un 'HttpContext' vide lorsque j'ai supprimé la liaison, mais cela s'est avéré provenir d'autre chose. En tout cas, merci pour votre aide! – devuxer

Questions connexes