0

当我将上下文绑定为InRequestScope时,在调用 DelegatingHandler 中的代码时释放上下文(在 Application_Start 中实例化并在控制器初始化之前执行)。如果我使用 InTransientScope,那么它可以工作,但我想要所有内容都有 1 个上下文。基于此答案here,这是拥有1个上下文的正确方法。

全球.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();

所以每当SendAsync在 ApiKeyHandler 中被调用时,上下文就已经被释放了。但是当调用控制器时(在调用 ApiKeyHandler 之后),上下文就可以了。我不太确定发生了什么。如果它不能与 InRequestScope 一起使用,我该如何像链接问题中的答案那样完成它?1 上下文 InTransientScope 和 InRequestScope 中的所有其他内容?

4

1 回答 1

1

为您的消息处理程序使用瞬态或单例范围的上下文会限制您为消息处理程序缓存所有实体。例如,如果一个实体被更改/删除或添加一个新实体,您的消息处理程序将永远不会适应该更改。在某些数据永远不会更改的情况下,这可能没问题。

如果您需要对会发生变化的最新数据进行操作,则不能使用这些范围。但这InRequestScope意味着您每次使用工厂时都必须创建一个新的服务实例(请参阅工厂扩展)。这样您就可以在请求范围内拥有上下文。

于 2012-04-08T03:36:50.423 回答