如何在整个应用程序中创建和注入用户特定的单例类?

Posted

技术标签:

【中文标题】如何在整个应用程序中创建和注入用户特定的单例类?【英文标题】: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 有没有办法检测用户并添加到字典中并在关闭浏览器后(信号器断开连接后)处理? 【参考方案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 如果只是简单地刷新将不起作用。它只是重新创建一个新对象。

以上是关于如何在整个应用程序中创建和注入用户特定的单例类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在分布式环境中处理单例类

iOS8 + Swift:创建一个真正的单例类[重复]

单例模式(Singleton)

iOS中的单例

我去,这才是完美的单例模式!

Ruby 中 BasicObject 的单例类的单例类