【发布时间】:2020-02-05 15:15:40
【问题描述】:
在 Blazor 服务器端,我使用单例服务在网站中创建了一个购物车,并且我希望不同的用户有不同的此服务实例,但是当我在两种类型的浏览器中加载网站时,将项目添加到购物车是反映在另一个浏览器中,甚至我也可以看到变化,(我还为每个用户的数据使用了单例服务,并将网站发布到网络上)。这是单例服务的正确行为吗?如何解决?
【问题讨论】:
在 Blazor 服务器端,我使用单例服务在网站中创建了一个购物车,并且我希望不同的用户有不同的此服务实例,但是当我在两种类型的浏览器中加载网站时,将项目添加到购物车是反映在另一个浏览器中,甚至我也可以看到变化,(我还为每个用户的数据使用了单例服务,并将网站发布到网络上)。这是单例服务的正确行为吗?如何解决?
【问题讨论】:
这是单例服务的预期行为。在您的情况下,您应该使用范围服务。
Transient 生命周期服务 (AddTransient) 是在每次从服务容器请求时创建的。此生命周期最适合轻量级、无状态的服务。
Scoped 生命周期服务 (AddScoped) 为每个客户端请求(连接)创建一次。
Singleton 生命周期服务 (AddSingleton) 在第一次被请求时创建(或者在 Startup.ConfigureServices 运行并使用服务注册指定实例时)。每个后续请求都使用相同的实例。如果应用程序需要单例行为,建议允许服务容器管理服务的生命周期。不要实现单例设计模式并提供用户代码来管理类中对象的生命周期。
【讨论】: