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

时间:2011-10-05 04:50:47

标签: asp.net-mvc asp.net-mvc-3 dependency-injection ninject ninject-2

我有一个带有简单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();
    }
}

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

  

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

     

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

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

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

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

public class UserInfo
{
    private readonly HttpContext _httpContext;

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

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

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 ... //
}

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

可能希望快速查看此问题,看看它是否与您的问题类似:Error "More than one matching bindings are available" when using Ninject.Web.Mvc 2.0 and ASP.NET MVC 1.0