如何在整个应用程序中创建和注入用户特定的单例类?
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
如果只是简单地刷新将不起作用。它只是重新创建一个新对象。以上是关于如何在整个应用程序中创建和注入用户特定的单例类?的主要内容,如果未能解决你的问题,请参考以下文章