如何在 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);
});
最后大家可以根据需要分别使用这两个接口
如何在 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);
});
最后大家可以根据需要分别使用这两个接口