InvalidOperationException: Невозможно использовать ограниченную службу 'Microsoft.JSInterop.IJSRuntime' из синглтона '... IAuthentication' в Blazor - PullRequest
0 голосов
/ 07 марта 2020

Я создаю проект Blazor, который сначала работает нормально, пока мне не нужно внедрить IJSRuntime в cs файл.

Microsoft.JSInterop;
...
...

public BaseService(IJSRuntime jSRuntime)
{
}

BaseService наследуется в другом сервисе с именем AuthenticationServices который также использует интерфейс под названием IAuthentication. Таким образом,

using Microsoft.JSInterop;

public class AuthenticationServices : BaseService, IAuthentication
{
    public AuthenticationServices(IJSRuntime jSRuntime) : base(jSRuntime)
    {
    }
}

Моя проблема в Startup.cs файле, который имеет этот код

services.AddSingleton<IAuthentication, AuthenticationServices>();

Если я запускаю приложение, оно говорит:

InvalidOperationException: Cannot consume scoped service 'Microsoft.JSInterop.IJSRuntime' from singleton '...IAuthentication'

Что делает это означает? Я правильно делаю, что мне нужно только что-то добавить?

1 Ответ

1 голос
/ 07 марта 2020

Внедрение зависимостей в Blazor имеет 3 различные политики жизни.

  • Singleton
  • Область действия
  • Transient

Singleton

Это означает, что любая служба этого типа будет иметь только один экземпляр.

Область действия

Это время жизни означает, что для набора объектов, созданного scope и в этой области будет просто один экземпляр. Обычно в большинстве сценариев ios область создается для обработки пользовательского сеанса (Blazor на стороне клиента) или подключения пользователя (Blazor на стороне сервера). Вы можете сравнить с областью действия для одного HTTP-запроса (ASP. NET).

Transient

Объект с таким временем жизни создается каждый раз, когда их запрашивают. Это то же самое, что и обычные new.

Правила потребления времени жизни

Учитывая характер этих политик времени жизни объекта, применяются следующие правила для потребления услуг.

  • Transient сервис может потреблять Transient, Scoped and Singleton` сервисов.
  • Scoped сервис может потреблять Scoped и Singleton сервисов. Но не может потреблять Transient сервисов.
  • Singleton сервисов может потреблять только Singleton сервисов. Но не может использовать сервисы Transient и Scoped.

Сервис IJSRuntime, зарегистрированный в Blazor как сервис Scoped, поэтому он может использоваться только сервисами Scoped и Transient .

Таким образом, вы должны либо сделать AuthenticationServices службу Scoped, либо избавиться от IJSRuntime в качестве параметра конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...