【问题标题】:How to correctly use dependency Injection with .Net Core SignalR如何正确使用 .Net Core SignalR 的依赖注入
【发布时间】:2019-05-27 14:55:22
【问题描述】:

我正在学习 .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
{
}

【问题讨论】:

  • 什么是TimerManager
  • 它只是一个静态类,用于管理我们下次检查db中的数据时,但我会在以后将其更改为SqlDependency
  • 嗯,它不是一个静态类,因为你正在更新它,所以你可能的意思是它上面有一个静态字段来存储一个计时器。那是你的问题。静力学和 DI 就像油和水。

标签: .net-core signalr asp.net-core-signalr


【解决方案1】:

您似乎使用的是 EF Core 上下文,它是一个作用域生命周期服务,这意味着 ASP.NET Core 中的每个请求生命周期。您的ChatService 必须具有比 HTTP 请求更长的生命周期,并且当您仍持有对它的引用时,容器将释放数据库上下文的单个实例。

因此,每次需要访问数据库时,都需要在ChatService的ctor中获取一个IServiceProvider容器,以及GetService数据库上下文。

【讨论】:

  • 我该怎么做?你能举个例子吗?我通过 IServiceProvider 也需要被注入,并且它的生命周期和上下文一样。
  • 您可以在没有任何注册表的情况下解析IServiceProvider,这将是正确引用当前范围的IServiceProvider
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 2018-06-16
  • 2012-05-27
  • 2021-10-23
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
相关资源
最近更新 更多