【发布时间】:2014-06-23 11:02:39
【问题描述】:
通过 Ninject 使用 Web API 2 和 OWIN 托管。
我想将当前的 IOwinContext 注入到某些服务中(这样我就可以在请求中获取委托人进行一些数据过滤)。
使用 Web 托管,在过去,我会简单地使用 HttpContext.Current,但这不是 OWIN 托管的选项(并且很好摆脱)。
This SO question 解释了如何使用 Autofac 进行操作。本质上,您创建一个依赖范围,然后在每个请求上调用 Autofac 的 Registerinstance 以将当前 IOwinContext 注册到该依赖范围中,如下所示:
app.Use(async (ctx, next) =>
{
// this creates a per-request, disposable scope
using (var scope = container.BeginLifetimeScope(b =>
{
// this makes owin context resolvable in the scope
b.RegisterInstance(ctx).As<IOwinContext>();
}))
{
// this makes scope available for downstream frameworks
ctx.Set<ILifetimeScope>("idsrv:AutofacScope", scope);
await next();
}
});
这很优雅。使用 Ninject 和 Ninject.Web.WebApi.OwinHosting 我已经为每个请求获得了一个命名范围,以便处理管道。但是,我无法在 ninject 中找到任何方法来镜像 AutoFac 的 RegisterInstance 方法:这里的关键是这个绑定只在这个特定的依赖范围内有效。
我已经阅读了有关 Scope 的各种选项,但我发现的所有内容都依赖于能够声明常量或 ToMethod。我在这里要做的是说,“好的,我现在有一个 ninject 依赖范围,如果有人从 this 范围请求 IOwinContext,请给他们这个我已经拥有的实例。
注意
我确实知道我可以从控制器中获取当前上下文并将其传递,但这反而违背了我试图做的事情的目的;我希望我的 DbContext 了解用户是谁,以便它可以过滤数据。当然,一旦我能够获得 IOwinContext,我实际上不会将其传递给 DbContext,而是使用 ToMethod 或类似方法来提取 ClaimsPrincipal,但这超出了本问题的范围。
【问题讨论】:
标签: asp.net-web-api ninject owin