【问题标题】:InvalidOperationException: Cannot consume scoped service 'Microsoft.JSInterop.IJSRuntime' from singleton '...IAuthentication' in BlazorInvalidOperationException:无法从 Blazor 中的单例“...IAuthentication”使用范围服务“Microsoft.JSInterop.IJSRuntime”
【发布时间】:2020-09-17 22:04:05
【问题描述】:

我正在创建 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.csfile 中

services.AddSingleton<IAuthentication, AuthenticationServices>();

如果我运行它说的应用程序,

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

这是什么意思?我是否正确地只需要添加一些东西?

【问题讨论】:

    标签: c# singleton blazor


    【解决方案1】:

    Blazor 中的依赖注入有 3 种不同的生命周期策略。

    • 单例
    • 范围
    • 瞬态

    单例

    这意味着该类型的任何服务都将只有一个实例。

    范围

    这个生命周期意味着对于创建的对象集scope 并且在该范围内将只有一个实例。通常在大多数情况下,创建范围是为了处理用户会话(客户端 Blazor)或用户连接(服务器端 Blazor)。您可以与每个 HTTP 请求 (ASP.NET) 的范围进行比较。

    瞬态

    每次请求时都会创建具有此生命周期的对象。和普通的new一样。

    终身消费规则

    鉴于这些对象生命周期策略的性质,适用以下使用服务的规则。

    • Transient 服务可以消费Transient, ScopedandSingleton` 服务。
    • Scoped 服务可以使用 ScopedSingleton 服务。但不能消费Transient服务。
    • Singleton 服务只能使用 Singleton 服务。但不能消费TransientScoped服务。

    服务 IJSRuntime 在 Blazor 中注册为 Scoped 服务,因此它只能由 ScopedTransient 服务使用。

    因此,您要么必须将AuthenticationServices 设为Scoped 服务,要么将IJSRuntime 作为构造函数参数。

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 2020-08-05
      • 1970-01-01
      相关资源
      最近更新 更多