【问题标题】:How to create and inject a user specific singleton class throughout the whole application?如何在整个应用程序中创建和注入用户特定的单例类?
【发布时间】:2020-09-26 12:02:52
【问题描述】:

我正在尝试在 Blazor 服务器端应用程序上创建用户特定的特定单例对象。有没有办法使用 .NET Core 依赖注入系统来实现这一点?我试过下面的代码。我已经创建了 SingletonTest 类。

public class SingletonTest
{
    private int _counter;
    public int Counter { get { return ++_counter; } }
}

在 Startup.cs 中注入 SingletonTest 类

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<SingletonTest>();
}

访问 index.razor 文件中的 Counter 属性

@page "/"
@inject SingletonTest singletonTest;
Counter: @singletonTest.Counter

当我尝试在两个不同的浏览器中访问索引页时,它们都在访问 SingletonTest 类的同一个实例。我有办法制作这个用户特定的单例吗?一旦浏览器关闭,服务器需要处理用户特定的单例对象并调用垃圾收集器。

【问题讨论】:

  • 如果你的单例存储了一个字典,由用户键入,而不是单个值?另外,不要期望 ++ 是线程安全的。
  • 您是打算限制可以使用该应用的用户数量,还是定期重启应用池?这充其量是一个有问题的设计。
  • 这也是数据库的用途。
  • @3Dave 没有用户限制,不会重新启动应用程序池。一旦浏览器关闭服务器需要处理用户创建的对象。
  • @mjwills 有没有办法检测用户并添加到字典中并在关闭浏览器后(信号器断开连接后)处理?

标签: c# asp.net-core .net-core dependency-injection blazor-server-side


【解决方案1】:

如果您希望它仅对单个浏览器实例可用,则需要添加 Scoped:

services.AddScoped<YourScopedClass>();

您可以使用的另一件事是预览 Nuget 包:

Microsoft.AspNetCore.ProtectedBrowserStorage

ProtectedBrowserStorage 的文档在此页面上大约下降了 40%: https://docs.microsoft.com/en-us/aspnet/core/blazor/state-management?view=aspnetcore-3.1

【讨论】:

  • AddScoped 如果只是简单地刷新将不起作用。它只是重新创建一个新对象。
猜你喜欢
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多