【问题标题】:Multiple types of Distributed Cache in ASP.NET CoreASP.NET Core 中的多种分布式缓存
【发布时间】:2019-02-02 15:58:46
【问题描述】:

假设我有一个 ASP.NET Core 2.x 应用程序。

我想使用 Redis 进行标准的 IDistributedCache 依赖注入,但使用 SQL Server 分布式缓存作为 Session 中间件的支持。

这可能吗?如果是这样,您将如何在Startup.cs 中进行配置?

【问题讨论】:

    标签: c# caching asp.net-core session-state


    【解决方案1】:

    分布式会话状态存储默认注入IDistributedCache 实例。这意味着如果您想将 SQL Server 分布式缓存用于会话状态,则应将其配置为默认缓存。

    为了您自己的缓存目的,您可以创建一个专门表示 Redis 缓存的“包装器接口”(例如 IRedisCache),注册它并将其注入您的中间件/控制器/服务中。例如:

    public interface IRedisDistributedCache : IDistributedCache
    {
    }
    
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Redis caching
        services.AddDistributedRedisCache();
        services.AddSingleton<IRedisDistributedCache, RedisCache>();
    
        // Add SQL Server caching as the default cache mechanism
        services.AddDistributedSqlServerCache();
    }
    
    public class FooController : Controller
    {
        private readonly IRedisDistributedCache _redisCache;
    
        public FooController(IRedisDistributedCache redisCache)
        {
            _redisCache = redisCache;
        }
    }
    

    【讨论】:

    • 在这种情况下,您将如何初始化 Redis 实例?通常,我在 services.AddDistributedRedisCache() 调用中对其进行了初始化。
    • @user1142433 查看代码示例。我像往常一样调用AddDistributedRedisCache(),然后将RedisCache 实现绑定到IRedisDistributedCache“包装接口”。
    • 所以您要向 DI 服务添加两个 IDistributedCache 缓存项(一个 Redis 和一个基于 SQL)?当 Session 调用 IDistributedCache 实现时,它会获取 SQL 版本,因为您在 Redis 版本之后将其添加到服务配置中?换句话说,服务解析器如何决定将哪个 IDistributedCache 提供给 Service 中间件?
    • @user1142433 是正确的。容器将选择您注册的最后一个。
    • 我现在明白它应该如何工作了。不幸的是,示例无法编译,因为在线服务上“没有从 RedisCache 到 IRedisDistributedCache 的隐式转换”。AddSingleton ();
    猜你喜欢
    • 2020-03-24
    • 2021-07-01
    • 2017-07-01
    • 2014-10-26
    • 1970-01-01
    • 2011-03-19
    • 2021-07-19
    • 2017-09-28
    • 2017-03-28
    相关资源
    最近更新 更多