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不止一次?
如果您使用Ninject.MVC3扩展名而不是必须删除
Bind<HttpContext>().ToMethod(context => HttpContext.Current); // <-- problem
Run Code Online (Sandbox Code Playgroud)
因为扩展已经添加了HttpContext绑定.
| 归档时间: |
|
| 查看次数: |
1650 次 |
| 最近记录: |