使用Ninject进行SignalR 2.2.0依赖注入3.2.2 InRequestScope不会按请求刷新

时间:2016-09-10 22:20:08

标签: asp.net-mvc dependency-injection signalr ninject

所以我有以下情况

  • MVC网站
  • A Hub
  • IUnitOfWork接口,其实现在构造函数中实例化EF 6上下文
  • Ninject为DI,其中IUnitOfWork注册为InRequestScope

TLDR:为什么信号器会保留每个连接的依赖关系?而不是按要求?

我最初用mvc 3制作了网站,并实现了以下内容 https://stackoverflow.com/a/22750142/28145

来自这篇文章 SignalR 2 Dependency Injection with Ninject

此帖子上接受的答案现在是 http://www.tomdupont.net/2014/01/dependency-injection-with-signalr-and.html

但这两种实现似乎对我的问题都没有影响。

我的网站已迁移到mvc 4,现在已经是mvc 5并且已经存在了很长时间。

我刚刚发现这个问题,因为我从未触发从客户端到信号器集线器的数据更改。

我验证这一点的方法是给我的IUnitOfWork实现一个在构造函数中生成的ID。

复制步骤:
您输入mvc页面/ site / action并获取html页面,html页面连接到您的集线器并实例化IUnitOfWork,您可以执行一些查询并返回一些数据。

另一个用户在同一个集线器上进入该站点并查询一些数据。

当第一个用户连接时检查IUnitofWork标识符时,标识符的值为1

第一个用户在集线器上执行服务器端操作,此操作

  • 从db
  • 获取数据
  • 比较数据以决定采取什么行动
  • 然后更改数据
  • 让我们说它设置属性Broken = true,之前它是假的。
  • 请注意,此新请求上IUnitOfWork的标识符仍为1

当第二个用户加载页面时,IUnitOfWork标识符为2,此页面在第一个用户执行其操作之前加载。

现在,另一个连接上的第二个用户在集线器上执行服务器端操作。此操作依赖于来自第一个用户的数据,它查询IUnitOfWork,从而查询属性Broken的DbContext。令我惊讶的是Broken = false的值,因此该动作什么都不做。 操作期间的IUnitOfWork标识符仍为2

第二个用户现在用F5刷新页面,结果signalr创建了一个新连接。 IUnitOfWork标识符现在为3

第二个用户再次尝试执行该功能。但是这次查询返回Broken = true,正如预期的那样。虽然IUnitOfWork标识符仍为3.原因是在第一个用户操作更改数据后初始化了上下文。

1 个答案:

答案 0 :(得分:0)

在没有看到任何代码的情况下很难给出准确的答案,但我的猜测是你没有重新创建SQLDependency触发器和/或重新附加事件处理程序。 SQLDT是一次性交易,如果你不重新创建它们,它们永远不会再次触发,加载页面的第二个用户在初始化时重新创建新的触发器,并且一旦你刷新了页面刷新,刷新页面断开连接并重新连接新的connectionid和新的触发器。