1

我正在将 MVC 3 与 Ninject 一起使用。我在 CreateKernel 方法中定义了 Global.asax.cs(一个 NinjectHttpApplication)中的所有绑定。

我还有一个为所有页面请求运行的 HTTP 模块。在执行 CreateKernel 方法后,模块在 PreRequestHandlerExecute 上运行其逻辑。

我想让 HTTP 模块通过将类类型链接到模块负责构建的特定实例变量来定义新的绑定。这可能吗?

基本上,在 HttpModule 中,我试图运行这个:

IUserContext userContext = userContextManager.GetUserContext();
Kernel.Bind<IUserContext>().ToConstant(userContext).InRequestScope();
4

1 回答 1

1

您不应该为每个请求重新绑定 - 如果您一次有 1000 个请求正在进行中,虽然可以让 Ninject 管理这些注册(例如,通过.Named使用绑定元数据工具的绑定),但您正在滥用容器而不是它应该做的(首先,你会做很多忙碌的工作,HttpModule在每次请求后删除注册吗?所有这一切都会导致争用,因为线程竞争对内核的访问。

相反,您HttpModule应该将相关信息存储在合适的地方(HttpContext.Items通常是合适的,但您可能有更好的主意?),然后使用ToMethod()来定义单个回调,该回调可以在给定请求需要使用时检索已存储的相关数据您的信息HttpModule已隐藏。

就像是:

Kernel.Bind<IUserContext>()
    .ToMethod( ctx=>(IUserContext)HttpContext.Items["userContext"] )
    .InRequestScope();
于 2012-08-29T23:16:46.120 回答