ASP.NET Core在运行时替换单例实例

时间:2019-01-12 23:06:30

标签: c# asp.net asp.net-core .net-core

我需要在ASP.NET Core应用程序的生存期内将对象保留在内存中,在该应用程序中我将该对象序列化并将其作为快照存储在持久性存储中。在对象的生命周期的后期,我需要通过反序列化并替换单例来恢复该对象的状态。不必是单例,但我需要保证对象只有一个实例。

我尝试了以下操作,但似乎仅将其替换为当前请求,此后什么也没有。我以为DI容器是它自己的对象副本,但我不确定

internal static SingleObject SingleObject { get; set; } = new SingleObject();

services.AddSingleton<OrderBook>(SingleObject)

是否可以替换单例实例,还是必须滚动自己的单例类来处理这种情况?

2 个答案:

答案 0 :(得分:1)

来自https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2

  

单人

     

单生命周期服务是在首次请求它们时创建的(或者在运行ConfigureServices并使用服务注册指定实例时创建)。每个后续请求都使用相同的实例。如果应用程序要求单例行为,则建议允许服务容器管理服务的生命周期。不要实现单例设计模式,不要在类中提供用户代码来管理对象的生存期。

因此,您不需要自己实现Singleton模式。 DI会解决这个问题。

您现在唯一要做的就是注入它。

注册如下:

services.AddSingleton<SingleObject>(new SingleObject())

答案 1 :(得分:0)

我邀请您阅读How to configure services based on request in ASP.NET Core

  

此后(正在构建容器),无法更改注册   不再。 @曾

在启动过程中,您只能注册一次示波器,因此您可以注册与以后要更新/刷新的功能相关的功能。我建议您是否需要更改实现高速缓存或内存存储中的内容,以便在需要时触发刷新。