如何使用键值对class的依赖注入来使用Redis Cache

How to use dependency injection for key value pair class to use Redis Cache

这是我的代码:

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)));

有人可以帮我解决这个问题吗?

在您发布的代码中,您已将类型定义添加到缓存中,但实际上您只在方法中使用它们,因此您的 class 应该如下所示:

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)));

如果有特定原因 为什么 您将键和值类型添加到 class,您可以编辑您的问题以说明原因吗?