在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缓存连接和实例,并在我想使用它们时分开它们?

最佳答案

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

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

  • 不幸的是,这两种操作都不适合您的要求。
    只能注册一项操作来配置特定类型的选项。
    .net核心依赖项注入(inject)的本地实现does not support注册覆盖。

    仍然有一种解决方案可以满足您的需求。但是,这种解决方案多少使我丧命。

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

    然后,定义从IDistributedCache继承的自定义IDistributedCache1和IDistributedCache2接口(interface)。

    最后,您定义类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>());
    

    关于c# - ASP.NET Core 2-多个Azure Redis缓存服务DI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46809012/

    10-13 03:15