让我先从一些设置信息开始......我正在使用存储库模式和Unity的依赖注入。存储库通过Linq-To-Sql实现。我将我的存储库注入到我的Web项目中的类构造函数中。存储库的生命周期为PerWebRequest
。
我已经实现了一些SignalR集线器并为SignalR设置了Unity依赖性解析器。我使用相同的 Unity配置文件将相同的存储库注入集线器,该文件指定这些存储库也是PerWebRequest
。
现在的妙语......我遇到了一个问题,即web项目会更新Linq-To-Sql实体,而SignalR中心会读取该实体而不会获得更新。我已经解决了#34;通过在读取SignalR集线器中的实体之前清除Linq-To-Sql缓存来解决此问题; DataContact.Refresh()
没有更新整个对象图。
我在集线器中使用的这些存储库的DataContext
也是PerWebRequest
,但它接收到SignalR集线器使用的单独DataContext
在Web请求完成后不会被销毁。看起来他们正在扮演单身实例。
SignalR应用程序是否在自己的流程中运行,因此来自集线器的DataContext
访问权限在单独的流程中是单独的DataContext
?
如果除了Web请求生命周期之外,如果它是一个单独的进程,SignalR集线器中的DataContext
如何实例化PerWebRequest
生命周期?此外,它看起来如何像一个单身人士?
答案 0 :(得分:0)
虽然我没有使用Linq2Sql
之类的内容或像PerWebRequest
这样的概念,但我并非100%肯定,但如果我是正确地说PerWebRequest
肯定与底层HTTP请求的生命周期有关,那么这些将很难与SignalR一起使用,因为它的行为可以根据所选择的传输策略发生很大变化。使用WebSockets,您可能在同一连接上有多个集线器实例/方法调用,而使用长轮询,每个HTTP请求可能有一个(或零)。查看here和here。
鉴于您使用SignalR编写的代码应该是相同的,无论传输如何,我认为对于集线器,您始终必须以特定方式处理存储库,可能使用ad-hoc工厂始终清除缓存每次必须将一个存储库提供给SignalR中心(您可以尝试智能并检查所使用的传输策略,但这些可能是泥水)。