我有一个带有简单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
多次定义绑定?
答案 0 :(得分:5)
如果您使用的是Ninject.MVC3扩展程序而不是必须删除
Bind<HttpContext>().ToMethod(context => HttpContext.Current); // <-- problem
因为扩展名已经添加了HttpContext绑定。
答案 1 :(得分:1)