【问题标题】:ASP.NET core Dependency Injection Singleton Cache Instance not the same object across classesASP.NET核心依赖注入单例缓存实例跨类不同对象
【发布时间】:2021-06-30 22:20:09
【问题描述】:

我正在尝试通过这样做来创建一个缓存管理器,该缓存管理器通过 ASP.NET Core 中的依赖注入注入

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
      .ConfigureServices(services => services.AddSingleton<ICacheManager, CacheManager>())
      .UseStartup<Startup>();

Program.cs 中,因此我可以在我的控制器类和Startup.cs 类中访问它(两个构造函数中都有ICacheManager

但是,每当我更新 Startup.cs 中的缓存时,当我的其他具有此依赖关系的控制器读取它时,它似乎并没有得到反映。这是一个单例实例,我的理解是两个类都将访问同一个对象实例。我错过了什么吗?

在我的Startup.cs 我只是有

public Startup(IConfiguration configuration, ICacheManager cacheManager)
{
    Configuration = configuration;
    _cacheManager= cacheManager;
}

我会将数据添加到Startup.cs的缓存中

在我的控制器中,我在构造函数中

public ChatRoomController(ICacheManager cacheManager)
{
    _cacheManager = cacheManager;
}

当我尝试使用 cacheManager(并发字典)中的数据时,我发现它是空的。

【问题讨论】:

  • 请出示startup.cscontroller类的代码
  • 为什么不使用标准的asp.net依赖注入方式?它在 Microsoft 文档中得到了很好的解释,并显示在默认的 asp 项目模板中

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


【解决方案1】:
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

无需分配或创建实例...

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<ICacheManager, CacheManager>()   
    }

自从...

将服务注入到它所在类的构造函数中 用过的。该框架负责创建一个 依赖的实例并在它不再存在时处理它 需要。

所以请保持您的 ChatRoomController 不变,如果可行,请告诉我

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

【讨论】:

  • 谢谢,但我还需要在 Startup 类中使用缓存管理器,所以我在 Startup 的构造函数中不需要它吗?似乎正在创建两个实例,一个用于启动类,一个用于控制器类
  • 似乎由于某种原因在启动类中正在实例化缓存管理器的另一个实例,而在我的控制器之间共享同一个缓存管理器,因此即使我注册了它也有两个实例作为单身人士
  • 尝试在启动类中使用它,添加一个 Dummy 值,然后尝试读取它,但没有将其分配给变量。
  • 我通过将其设置为 Configure 方法中的另一个参数而不在 ConfigureServices 中执行任何操作来使其工作。你知道为什么会这样吗?
  • 请更新您的问题或在新答案中提供解决方案以了解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2013-06-17
  • 2018-04-05
  • 2020-10-13
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多