【问题标题】:InRequestScope disposes entitycontext for DelegatingHandlersInRequestScope 为 DelegatingHandlers 配置实体上下文
【发布时间】:2012-04-09 16:04:27
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 2022-01-28
      • 2023-04-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多