激活HttpContext时出错 - 可以使用多个匹配的绑定

dev*_*xer 6 asp.net-mvc dependency-injection ninject ninject-2 asp.net-mvc-3

我有一个带有简单NinjectModule的ASP.NET MVC应用程序:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我整个应用程序中唯一的绑定代码.当我运行我的应用程序时,我立即得到此运行时错误:

激活HttpContext时出错
可以使用多个匹配的绑定.
激活路径:
3)将依赖关系HttpContext注入到UserInfo类型的构造函数的参数httpContext中
2)将依赖关系UserInfo注入到HomeController类型的构造函数的参数userInfo中
1)HomeController的请求

建议:
1)确保您只为HttpContext定义了一次绑定.

错误消息似乎是说我已经HttpContext多次定义了绑定,但是整个应用程序中唯一的绑定语句都在MainModule,并且我显然只定义了一个绑定HttpContext.如果我注释掉那行代码,我就会停止获取错误,但是HttpContext注入的错误是不正确的(它是一个空的,新实例化HttpContext而不是HttpContext.Current).

错误消息确实描述了我期望发生的确切注射顺序......

HttpContext应该注入到构造函数中UserInfo,如下所示:

public class UserInfo
{
    private readonly HttpContext _httpContext;

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

    // ... etc ... //
}
Run Code Online (Sandbox Code Playgroud)

并且UserInfo应该注入到构造函数中HomeController,如下所示:

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 ... //
}
Run Code Online (Sandbox Code Playgroud)

为什么会导致错误?这似乎是一个非常直接的依赖注入场景.我以何种方式定义绑定HttpContext不止一次?

Rem*_*oor 5

如果您使用Ninject.MVC3扩展名而不是必须删除

Bind<HttpContext>().ToMethod(context => HttpContext.Current); // <-- problem
Run Code Online (Sandbox Code Playgroud)

因为扩展已经添加了HttpContext绑定.