如何解决如何对键值对类使用依赖注入以使用Redis缓存
这是我的代码:
public class RedisCache<TKey,TVal> : ICache<TKey,TVal> where TVal : class
{
TimeSpan _defaultCacheDuration;
Lazy<ConnectionMultiplexer> _connection;
public RedisCache(string connectionString,TimeSpan defaultDuration)
{
if (defaultDuration <= TimeSpan.Zero)
throw new ArgumentOutOfRangeException(nameof(defaultDuration),"Duration must be greater than zero");
_connection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(connectionString));
_defaultCacheDuration = defaultDuration;
}
public async Task<TVal> GetAsync(TKey key)
{
var database = _connection.Value.GetDatabase();
string keyString = key?.ToString() ?? "null";
var result = await database.StringGetAsync(keyString);
return result.IsNull ? null : GetObjectFromString(result);
}
}
如何在startup.cs中注入它?
我尝试了这会引发编译时错误:services.AddSingleton<ICache<>>(provider => new RedisCache<,>("myPrettyLocalhost:6379",new TimeSpan(1)));
有人可以帮我吗?
解决方法
在发布的代码中,您已将类型定义添加到缓存中,但实际上您仅在方法中使用它们,因此您的类应如下所示:
public class RedisCache {
TimeSpan _defaultCacheDuration;
Lazy<ConnectionMultiplexer> _connection;
public RedisCache(string connectionString,TimeSpan defaultDuration) {
if (defaultDuration <= TimeSpan.Zero)
throw new ArgumentOutOfRangeException(nameof(defaultDuration),"Duration must be greater than zero");
_connection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(connectionString));
_defaultCacheDuration = defaultDuration;
}
public async Task<TVal> GetAsync<TKey,TVal>(TKey key) where TVal : class {
var database = _connection.Value.GetDatabase();
string keyString = key?.ToString() ?? "null";
var result = await database.StringGetAsync(keyString);
return result.IsNull ? null : GetObjectFromString(result);
}
}
这使得注入变得简单:
services.AddSingleton<ICache>(provider => new RedisCache("myPrettyLocalhost:6379",new TimeSpan(1)));
如果有特定原因为什么将键和值类型添加到类中,您可以编辑问题以显示原因吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。