Ho un app ASP.NET MVC con un semplice NinjectModule:Errore attivando HttpContext - Più di un corrispondente vincolante è disponibile
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();
}
}
Questo è l'unico codice vincolante in tutta la mia app. Quando eseguo la mia applicazione, immediatamente ottengo questo errore di runtime:
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 HomeControllerSuggestions:
1) Ensure that you have defined a binding for HttpContext only once.
Il messaggio di errore sembra dire che ho definito il HttpContext
vincolante più di una volta, ma le uniche dichiarazioni vincolanti in tutta l'applicazione sono in MainModule
e ho chiaramente definito solo un binding per HttpContext
. Se commento questa riga di codice, smetto di ricevere l'errore, ma il HttpContext
che viene iniettato non è corretto (è un vuoto, appena istanziato HttpContext
anziché HttpContext.Current
).
L'errore non descrivere l'esatta sequenza di iniezione mi aspetterei che si verifichi ...
HttpContext
dovrebbe ottenere iniettato nel costruttore della UserInfo
, che assomiglia a questo:
public class UserInfo
{
private readonly HttpContext _httpContext;
public UserInfo(HttpContext httpContext)
{
_httpContext = httpContext;
}
// ... etc ... //
}
E UserInfo
dovrebbe ottenere iniettato nel costruttore della HomeController
, che assomiglia a questo:
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 ... //
}
Perché ciò genera un errore? Questo sembra uno scenario di iniezione di dipendenza molto diretto. In che modo sto definendo il binding per HttpContext
più di una volta?
Ci hai mostrato il modulo principale. Non ci hai detto se stai usando Ninject.Web.MVC3 e/o dove viene creato il tuo Kernel. L'errore suggerisce che stai eseguendo i carichi del modulo in un singolo kernel più di una volta, ad es. innescandolo in 'Global' /' HttpApplication' construction/start (di cui ci sono quasi sempre> 1). –