ASP.NET Core 2 - 多个 Azure Redis 缓存服务 DI

Posted

技术标签:

【中文标题】ASP.NET Core 2 - 多个 Azure Redis 缓存服务 DI【英文标题】:ASP.NET Core 2 - Multiple Azure Redis Cache services DI 【发布时间】:2017-10-18 11:21:48 【问题描述】:

在 ASP.NET Core 2 中,我们可以像这样添加 Azure Redis 缓存:

 services.AddDistributedRedisCache(config =>
 
    config.Configuration = Configuration.GetConnectionString("RedisCacheConnection");
    config.InstanceName = "MYINSTANCE";
 );

那么用法会是这样的:

private readonly IDistributedCache _cache;

public MyController(IDistributedCache cache)

   _cache = cache;

我该怎么做才能拥有:

private readonly IDistributedCache _cache1;
private readonly IDistributedCache _cache2;

public MyController(IDistributedCache cache1, IDistributedCache cache2)

   _cache1 = cache1;
   _cache2 = cache2;

我的问题如何添加另一个指向不同 Azure Redis 缓存连接和实例的服务,并在我想使用它们时将它们分开?

【问题讨论】:

使用默认的IDistributedCache 方法实际上无法管理此类高级场景。您应该使用像 CacheManager 这样的库,它允许您根据类型参数定义不同的缓存。 一个可能的选项是使用Strategy Pattern 来选择要在运行时使用的缓存。 【参考方案1】:

在幕后,AddDistributedRedisCache() 扩展方法执行以下操作 (code on github):

    注册操作以配置RedisCacheOptions。您传递给 AddDistributedRedisCache() 的 Lambda 对此负责。 RedisCacheOptions 的实例被传递给 RedisCache 的构造函数,并封装在 IOptions<T> 中。 注册单音实现 RedisCacheIDistributedCache 接口。

很遗憾,这两种操作都不太适合您的要求。 只能注册一项操作来配置特定类型的选项。 .net核心依赖注入does not support注册覆盖的原生实现。

仍有一种解决方案可以满足您的需求。然而,这个解决方案有点害死我。

诀窍是您从 RedisCacheOptions 继承您的自定义 RedisCacheOptions1、RedisCacheOptions2 并为它们注册不同的配置。

然后定义继承自 IDistributedCache 的自定义 IDistributedCache1 和 IDistributedCache2 接口。

最后你定义类 RedisCache1(继承 RedisCache 的实现并实现 IDistributedCache1)和 RedisCache2(相同)。

类似这样的:

public interface IDistributedCache1 : IDistributedCache



public interface IDistributedCache2 : IDistributedCache



public class RedisCacheOptions1 : RedisCacheOptions



public class RedisCacheOptions2 : RedisCacheOptions



public class RedisCache1 : RedisCache, IDistributedCache1

    public RedisCache1(IOptions<RedisCacheOptions1> optionsAccessor) : base(optionsAccessor)
    
    


public class RedisCache2 : RedisCache, IDistributedCache2

    public RedisCache2(IOptions<RedisCacheOptions2> optionsAccessor) : base(optionsAccessor)
    
    


public class MyController : Controller

    private readonly IDistributedCache _cache1;
    private readonly IDistributedCache _cache2;

    public MyController(IDistributedCache1 cache1, IDistributedCache2 cache2)
    
        _cache1 = cache1;
        _cache2 = cache2;
    


//  Bootstrapping

services.AddOptions();

services.Configure<RedisCacheOptions1>(config =>

    config.Configuration = Configuration.GetConnectionString("RedisCacheConnection1");
    config.InstanceName = "MYINSTANCE1";
);
services.Configure<RedisCacheOptions2>(config =>

    config.Configuration = Configuration.GetConnectionString("RedisCacheConnection2");
    config.InstanceName = "MYINSTANCE2";
);

services.Add(ServiceDescriptor.Singleton<IDistributedCache1, RedisCache1>());
services.Add(ServiceDescriptor.Singleton<IDistributedCache2, RedisCache2>());

【讨论】:

其实我和你走的是同一条路。你是什​​么意思:however this solution somewhat killing me?我认为这种方法没有任何问题,我认为可以正常工作 我的意思是它需要付出更多的努力 :(

以上是关于ASP.NET Core 2 - 多个 Azure Redis 缓存服务 DI的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2.2 中的 Azure AD 身份验证

Azure WebApp Asp.NET Core 2 错误:启动应用程序时出错

ASP.NET 4.5 在 ASP.NET Core 2.0 应用程序下的 Azure Web App 中将 502.5 作为虚拟应用程序抛出

使用 Web Deploy 在 Azure 中部署普通的 ASP.NET Core 2.2 Web 应用程序会引发错误

带有 JWT Bearer 令牌和 ASP.NET Core 2 WebApi 的 Azure AD 用户信息

在 ASP.NET Core 2.0 中使用带有身份模型的 Azure Active Directory OAuth