Как правильно использовать инъекцию зависимостей с .Net Core SignalR - PullRequest
0 голосов
/ 27 мая 2019

Я изучаю .Net Core SignalR и исследую, как я могу использовать его с живыми графиками моего приложения.Я играю с некоторыми примерами в сети, и все они работают, но я не знаю, как использовать SignalR с опросом базы данных.Я получаю сообщение об ошибке ниже:

Невозможно получить доступ к удаленному объекту ...

Я предполагаю, что это связано с моим контекстом, который удаляется после завершения запроса,Я использую внедрение зависимостей.

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 голосов
/ 28 мая 2019

Похоже, что вы используете контекст EF Core, который является сервисом с ограниченным сроком действия, что означает время жизни каждого запроса в ASP.NET Core.У вашего ChatService должно быть больше времени жизни, чем у HTTP-запроса, и контейнер будет располагать один экземпляр контекста базы данных, пока вы все еще удерживаете ссылку на него.

Таким образом, вам необходимо получитьконтейнер IServiceProvider в ctor ChatService и GetService контекст базы данных каждый раз, когда вам необходим доступ к базе данных.

...