InRequestScope为DelegatingHandlers配置entitycontext

时间:2012-04-06 19:13:23

标签: asp.net-mvc ninject asp.net-web-api

当我将上下文绑定为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中的所有其他内容?

1 个答案:

答案 0 :(得分:1)

为消息处理程序使用transient或singleton作用域上下文为您提供了为消息处理程序缓存所有实体的限制。例如。如果更改/删除实体或添加新实体,则消息处理程序将永远不会适应该更改。在某些永远不会更改数据的情况下,这可能没问题。

如果您需要操作将要更改的最新数据,则无法使用这些范围。但是InRequestScope意味着每次使用工厂时都必须创建一个新的服务实例(参见factory extension)。这样你就可以在请求范围内拥有上下文。