.net-core - 如何正确使用 .Net Core SignalR 的依赖注入
问题描述
我正在学习 .Net Core SignalR 并研究如何将它与我的应用程序实时图表一起使用。我在网上玩了一些示例,它们都可以工作,但是我不知道如何将 SignalR 与数据库轮询一起使用。我收到以下错误:
无法访问已处置的对象...
我假设它与请求完成后正在处理我的上下文有关。我正在使用依赖注入。
聊天控制器
public class ChatController : ControllerBase
{
private IChatService _chatService;
private IChatContext<ChatHub> _hub;
public ChatController(IChatContext<ChatHub> hub, IChatService chatService)
{
_hub = hub;
_chatService = chatService;
}
public IActionResult Get()
{
var timerManager = new TimerManager(() => _hub.Clients.All.SendAsync("transferchatdata", _chatService.ChatDataByProds()));
return Ok(new { Message = "Request Completed" });
}
}
聊天服务
public interface IChatService
{
IEnumerable<ChatDataByProd> ChatDataByProds();
}
public class ChatService : IChatService
{
private ChatContext _context;
public ChatService(ChatContext context)
{
_context = context;
}
public IEnumerable<ChatDataByProd> ChatDataByProds()
{
return _context.ChatDataByProds;
}
}
聊天中心
public class ChatHub : Hub
{
}
解决方案
似乎您正在使用作为范围生命周期服务的 EF Core 上下文,这意味着 ASP.NET Core 中的每个请求生命周期。您ChatService
的生命周期必须比 HTTP 请求更长,并且当您仍然持有对它的引用时,容器将释放数据库上下文的单个实例。
因此,每次需要访问数据库时,都需要IServiceProvider
在 ctor 中获取一个容器ChatService
,以及数据库上下文。GetService
推荐阅读
- css - 如何在 Angular Material textarea 字段上添加边框?
- gstreamer-1.0 - v4l2src 到 c 应用程序的简单管道
- reactjs - 将 Small Gatsby 应用程序嵌入到 Wordpress 页面中?
- macos - 在 Mac 上设置 React Native
- javascript - 为什么此代码将键/值对添加到 browser.storage.local 而不是覆盖它?
- java - javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“ProcessCreditApplication”)。预期的元素是
- reporting-services - SSRS 在 CSV 导出中重复父组 ID
- javascript - JQUERY,如果按顺序包含数字,则突出显示一列
- javascript - 将多个类一一添加到dom元素js
- ejabberd - Ejabberd MucSub 房间离开/退出问题