【问题标题】:ASP.NET Core Replacing a Singleton Instance at RuntimeASP.NET Core 在运行时替换单例实例
【发布时间】:2019-06-07 10:45:52
【问题描述】:

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

我尝试了以下方法,但它似乎只替换了当前请求,之后没有任何内容。我假设 DI 容器制作了它自己的对象副本,但我不确定

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

services.AddSingleton<OrderBook>(SingleObject)

有没有办法替换单例实例,还是我必须推出自己的单例类来处理这种情况?

【问题讨论】:

  • replace the singleton instance 是什么意思?您可以直接更改单例实例属性。
  • 我可以替换那个值,但它似乎没有更新容器中存储的值

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


【解决方案1】:

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

单例

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

因此,您不需要自己实现Singleton 模式。 DI 负责处理。

你现在唯一应该做的就是注入它。

注册如下:

services.AddSingleton&lt;SingleObject&gt;(new SingleObject())

【讨论】:

  • 也许我的问题不够清楚,但我需要能够在运行时更改单例值
  • 一旦对象被注册到服务中,你应该能够在任何需要的地方更改值..
  • @Atmanirbhar Bharat 更改该对象或对象本身的属性值?如果是后者 - 如何?
  • 单例实例化后,它将在主机的生命周期中存在。您可以对其成员(字段、属性、方法等)做任何事情,但您不能“替换”服务本身。你需要一个单例容器来保持一个变化的值,或者直接访问一个静态变量。
【解决方案2】:

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

之后(正在构建容器),无法更改注册 了。 @Tseng​​p>

您只能在启动期间注册一次作用域,因此您可以注册与以后要更新/刷新的内容相关的函数。如果您需要更改实现缓存或内存存储的内容,我会建议您在需要时触发刷新。

【讨论】:

    【解决方案3】:

    我有一个 CachedData 的单身人士,直到意识到需要在某个时候快速重置它。所以只是实现了一个包装器(见下文)。现在包装器ResettableCachedData 是单例的,CachedData 是瞬态的。任何时候都可以快速Reset() 重新创建CachedData,同时通过ResettableCachedData.Data 访问它的数据。

        public class ResettableCachedData
        {
            private readonly IServiceProvider _services;
    
            public ResettableCachedData(IServiceProvider services)
            {
                _services = services;
    
                Reset();
            }
    
            public CachedData Data { get; protected set; }
    
            public void Reset()
            {
                Data = _services.GetRequiredService<CachedData>();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-01
      • 2019-07-14
      • 2023-03-20
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      相关资源
      最近更新 更多