我目前使用NancyFx实现了RESTful服务,该服务使用TokenAuthentication来跟踪已登录的用户。对于各种活动,我实际上需要知道哪个用户发送了请求,所以我在解决方案中添加了IUserContext
接口,在Nancy项目中,我在一个带有NancyContext
的类中实现了接口并返回用户名/声明/身份验证状态。使用Ninject通过构造函数注入将所述IUserContext
传递给服务。
在应用程序级别的NinjectModule中,我像这样绑定接口:
Bind<IUserContext>().To<UserContext>();
当Nancy在第一次运行时实例化路由发现的所有模块并且连接到服务器将导致Ninject错误时,IUserContext
似乎不会绑定任何东西。
在引导程序中,我重写了RequestStartup
和ConfigureRequestContainer
方法,以便将IUserContext重新绑定为常量,如下所示:
protected override void RequestStartup(IKernel container, IPipelines pipelines, NancyContext context)
{
base.RequestStartup(container, pipelines, context);
TokenAuthentication.Enable(pipelines, new TokenAuthenticationConfiguration(container.Get<ITokenizer>()));
}
protected override void ConfigureRequestContainer(IKernel container, NancyContext context)
{
container.Rebind<IUserContext>()
.ToConstant(new UserContext(context))
.InSingletonScope();
base.ConfigureRequestContainer(container, context);
}
这两种方法运行愉快,是在ConfigureRequestContainer
之前执行的RequestStartup
。但是,无论我在这里尝试什么,传递到我的服务的IUserContext
将始终收到与正在执行的当前请求无关的NancyContext
,几乎就像ConfigureRequestContainer
中的重新绑定一样方法被忽略。
IUserContext
和需要IUserContext
的其中一项服务时,就像这样:
public OrdersModule(IUserContext userContext, OrdersService orderService)
userContext
实际上将NancyContext
包裹请求,orderService
将收到一个不同的上下文,包含空NancyContext
(如同,没有请求数据,没有用户等)。
这里发生了什么?我是否遗漏了各种内核创建流程中的重要内容,或者Nancy是否缓存了各种对象?
编辑:我认为Ninject + ChildKernel是罪魁祸首:我创建了一个NullContext
,它在应用程序内核中绑定,然后绑定到{{1}中的正确UserContext }。每当在ChildKernel中查找服务时它无法找到它,它会将查找传递给父内核,后者不会引用ChildKernel进行后续查找(似乎)。结果:它不会解析我刚刚绑定在RequestStartup方法中的IUserContext,它将使用我之前在应用程序容器上定义的NullContext。