当我将上下文绑定为InRequestScope
时,将调用DelegatingHandler中的代码(在Application_Start中实例化并在初始化控制器之前执行)来处理上下文。如果我使用InTransientScope,它可以工作,但我想要一切上下文。基于这个答案here,这是获得1个上下文的正确方法。
Global.asax中
static void Configure(HttpConfiguration config)
{
var kernel = NinjectWebCommon.Bootstrapper.Kernel;
config.MessageHandlers.Add(new ApiKeyHandler(kernel.Get<IApiService>()));
}
绑定
//if i remove InRequestScope here, everything works.
kernel.Bind<EntityDatabaseContext>().ToMethod(context => new EntityDatabaseContext()).InRequestScope();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
//repositories
kernel.Bind<IRepository<Application>>().To<Repository<Application>>().InRequestScope();
//services
kernel.Bind<IApiService>().To<ApiService>().InRequestScope();
因此,只要在ApiKeyHandler中调用SendAsync
,就会释放上下文。但是当调用控制器时(在调用ApiKeyHandler之后),上下文很好。我不太确定发生了什么事。如果它无法与InRequestScope一起使用,我怎样才能像链接问题中的答案那样完成它? 1上下文InTransientScope和InRequestScope中的所有其他内容?
答案 0 :(得分:1)
为消息处理程序使用transient或singleton作用域上下文为您提供了为消息处理程序缓存所有实体的限制。例如。如果更改/删除实体或添加新实体,则消息处理程序将永远不会适应该更改。在某些永远不会更改数据的情况下,这可能没问题。
如果您需要操作将要更改的最新数据,则无法使用这些范围。但是InRequestScope
意味着每次使用工厂时都必须创建一个新的服务实例(参见factory extension)。这样你就可以在请求范围内拥有上下文。