如何在.Net Core SignalR中正确使用依赖项注入

时间:2019-05-27 14:55:22

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

我正在学习.Net Core SignalR,并研究如何在我的应用实时图表中使用它。我在网上玩了一些示例,它们都可以工作,但是我不知道如何在数据库轮询中使用SignalR。我遇到以下错误:

  

无法访问已处置的对象...

我假设它与我的contex有关,在请求完成后将其丢弃。我正在使用依赖注入。

ChatController

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" });
    }
}

ChatService

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;
    }
}

ChatHub

    public class ChatHub : Hub
{
}

1 个答案:

答案 0 :(得分:0)

似乎您正在使用EF Core上下文,该上下文是范围内的生存期服务,这意味着ASP.NET Core中的每个请求生存期。您的ChatService的生存期必须比HTTP请求更长,并且在您仍保留对容器的引用的同时,容器将处置数据库上下文的单个实例。

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