我有一个ASP.NET MVC 4.5 Web API应用程序,在某些情况下也使用SignalR。这意味着Web Api控制器和SignalR集线器可以调用基础业务逻辑。
使用Unity注入依赖关系,我设计了使用PerRequestLifetimeManager重用存储库和ApplicationDbContext的应用程序。由于许多存储库访问数据库,因此应该限制打开的数据库连接数量。在控制器中的请求结束时,我调用SaveChanges(),并且完整请求所产生的更改将存储在数据库中。
当我使用Web Api时,这种行为很有效,但是当使用SignalR时我遇到了一些麻烦:我创建了一个混合LifetimeManager,它在Http请求存在时表现为PerRequestLifetimeManager,而在没有Http请求时表现为TransientLifetimeManager(它&#39 ;然后是一个SignalR请求)。麻烦的是,在SignalR调用期间创建的各种存储库都将获得自己的ApplicationDbContext实例,并且永远不会在这些实例上调用SaveChanges()。
所以,我需要一个像PerRequestLifetimeManager一样的生命周期管理器,但是对于SignalR。有人可以帮帮我吗?或者我在这里错误的轨道,每个存储库是否应该始终获得自己的ApplicationDbContext实例,并在可以保持更改时调用SaveChanges()本身?我还没有做到这一点,因为我虽然拥有太多的数据库连接,但我想为整个请求提供类似于一个事务的内容。