CoderWil Ответов: 0

Может ли фоновая служба вызвать 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'.



Может ли кто-нибудь посоветовать, как преодолеть эту проблему?

Заранее спасибо
Уилсон

0 Ответов