如何在 Net Core DI 中使用 Microsoft.Extensions.Caching.StackExchangeRedis 的多个实现?

How to use multiple implementations of Microsoft.Extensions.Caching.StackExchangeRedis with Net Core DI?

如何在 net core 中使用多个 redis 实例以及 DI 容器?

启动时我有以下内容:

services.AddStackExchangeRedisCache(options =>
{
     options.Configuration = distributedCacheConnectionString;
});

services.AddStackExchangeRedisCache(options =>
{
     options.Configuration = myAppSessionCacheConnectionString;
});

对于注入,我会在构造函数中使用如下内容:

namespace MyApp
{
    public class MyClass
    {
        public MyClass(IDistributedCache myAppSessionCache)
        {
            // use a specific redis cache instance here
            _distributedCache = myAppSessionCache;
        }
    }
}

namespace MyApp
{
    public class MyClass2
    {
        public MyClass2(IDistributedCache distributedCache)
        {
            // use a specific redis cache instance here
            _distributedCache = distributedCache;
        }
    }
}

我知道对于网络核心,DI 容器与 Unity 或 Spring 等类似的东西相比是有限的...我知道对于一个接口的多个实现有几个技巧,一个是注入接口的 IEnumerable ,另一个例子是类型化接口等......我只是没有看到 redis 缓存的选项,我们确实需要一个应用程序与系统内的 2 个独立的 redis 服务器进行通信。

我主要是在寻找阻力最小的路径。我总是可以围绕 Redis 客户端创建一个包装器。我只是希望有什么东西存在,但我只是忽略了它。

我认为您需要能够区分系统中的两种缓存(一种用于会话,另一种用于普通缓存)。

我认为这样的事情是可以做到的:

public interface ISessionDistributedCache : IDistributedCache {}

public interface IOrdinaryDistributedCache : IDistributedCache {}

那么我们就要实现这些接口了

public class SessionDistributedCache : RedisCache, ISessionDistributedCache 
{
   public SessionDistributedCache(IOptions<RedisCacheOptions> optionsAccessor): base(optionsAccessor) {}
}

public class OrdinaryDistributedCache : RedisCache, IOrdinaryDistributedCache 
{
   public SessionDistributedCache(IOptions<RedisCacheOptions> optionsAccessor): base(optionsAccessor) {}
}

然后在启动时,您可以像这样注册这些服务:

services.AddSingleton<ISessionDistributedCache>(x =>
        {
            var options = x.GetRequiredService<IOptions<RedisCacheOptions>>();
            //options.Value.Configuration = ...  set you server IP, etc
            return new SessionDistributedCache(options);
        });
services.AddSingleton<IOrdinaryDistributedCache>(x =>
        {
            var options = x.GetRequiredService<IOptions<RedisCacheOptions>>();
            //options.Value.Configuration = ...  set you server IP, etc
            return new OrdinaryDistributedCache(options);
        });

最后大家可以根据需要分别使用这两个接口