Может ли фоновая служба вызвать jsruntime?
Привет, я хотел обновить в режиме реального времени общее количество уведомлений, кроме значка. Значок и объект number находятся в верхнем меню _Layout.cshtml.
<li class="nav-item dropdown"> <a class="nav-link" data-toggle="dropdown" href="#" style="width:66px"> @* The "noticeCount" will be updated from real time *@ <i class="fa fa-bell-o notification"> <span id="noticeCount" class="badge badge-warning navbar-badge"> </span> </i> </a> ...
Я также определил функцию JS в файл _Layout.cshtml ПО для JsRuntime называть
<script> //window.setElementText = (element, text) => element.innerText = text; window.updateNoticeNumber = (noticeInt) => { // ... client-side processing/display code ... //return 'Done!'; noticeCount.innerText = noticeInt; }; </script>
Моя справочная служба
using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Hosting; using Microsoft.JSInterop; using MyDataLibrary.DataServices; namespace MyNamespace { public class LongRunningWorker : BackgroundService { private readonly ICounter _counter; private readonly INoticeCount _noticecounter; private readonly JSRuntime _jsfunc; public LongRunningWorker(ICounter counter, INoticeCount noticeCount, JSRuntime jsfunc ) { _counter = counter ?? throw new ArgumentNullException(nameof(counter)); _noticecounter = noticeCount ?? throw new ArgumentNullException(nameof(noticeCount)); _jsfunc = jsfunc; } protected override Task ExecuteAsync(CancellationToken stoppingToken) { return Task.Run(async () => { while (!stoppingToken.IsCancellationRequested) { long _noticecount = 0; _counter.Increment(); _noticecounter.GetCounter(_noticecount); await _jsfunc.InvokeAsync<string>("updateNoticeNumber", _noticecount.ToString().Trim()); await Task.Delay(500); } }); } } }
Когда я пытаюсь запустить приложение, я получаю следующую ошибку.
System.AggregateException: 'Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Microsoft.Extensions.Hosting.IHostedService Lifetime: Singleton ImplementationType: Mynamespace.LongRunningWorker': Unable to resolve service for type 'Microsoft.JSInterop.JSRuntime' while attempting to activate 'Mynamespace.LongRunningWorker'.)'
Что я уже пробовал:
Я также попытался создать кодовый интерфейс для JsRuntime и зарегистрировал его в Startup.cs
using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using T20DataLibrary.DataModels; using T20DataLibrary.DataServices; namespace AspNetMaker2020 { public class JsInteropClasses : IJsInteropClasses { private readonly IJSRuntime _jsRuntime; public JsInteropClasses(IJSRuntime jsRuntime) { _jsRuntime = jsRuntime; } public async Task updateCounter(long _count) { await _jsRuntime.InvokeAsync<string>("updateNoticeNumber", _count.ToString().Trim(), _count.ToString().Trim() + " new notifications"); } } }
services.AddSingleton<IJsInteropClasses, JsInteropClasses>(); services.AddHostedService<LongRunningWorker>();
И модифицировал "LongRunningWorker" следующим образом
private readonly IJSRuntime _jsfunc;
Однако в итоге я получил еще одну ошибку типа,
InvalidOperationException: Error while validating the service descriptor 'ServiceType: MyNamespace.IJsInteropClasses Lifetime: Singleton ImplementationType: MyNamespace.JsInteropClasses': Cannot consume scoped service 'Microsoft.JSInterop.IJSRuntime' from singleton 'MyNamespace.IJsInteropClasses'.
Может ли кто-нибудь посоветовать, как преодолеть эту проблему?
Заранее спасибо
Уилсон