C# 无法解析类型为';ASP.Net核心中的ServiceStack.Redis.Generic.IRedisTypedClient

C# 无法解析类型为';ASP.Net核心中的ServiceStack.Redis.Generic.IRedisTypedClient,c#,dependency-injection,redis,asp.net-core-2.1,stackexchange.redis,C#,Dependency Injection,Redis,Asp.net Core 2.1,Stackexchange.redis,我有ASP.Net核心2.1app。需要使用RedisCache作为缓存 这就是我的方法将项添加到缓存的方式 public class RedisCache : ICache<Customer> //custom interface { #region Private private readonly IConfiguration _configuration; private readonly IDatabase _cache; private r

我有
ASP.Net核心2.1
app。需要使用
RedisCache
作为缓存

这就是我的方法将项添加到缓存的方式

public class RedisCache : ICache<Customer> //custom interface
{
    #region Private

    private readonly IConfiguration _configuration;
    private readonly IDatabase _cache;
    private readonly ConnectionMultiplexer _connection;
    private readonly IRedisTypedClient<Customer> _redisClient;

    #endregion Private

    #region Ctor

    public RedisCache(IConfiguration configuration, IRedisTypedClient<Customer> redisClient)
    {
        _configuration = configuration;
        _connection = ConnectionMultiplexer.Connect(configuration.GetSection("AWS:Cache")["Redis:Server"]);
        _cache = _connection.GetDatabase();
        _redisClient = redisClient;
    }

    #endregion Ctor

    public async Task<Customer> AddItem(Customer item)
    {
        try
        {
            await Task.Run(() => _redisClient.GetAndSetValue(item.Id, item)).ConfigureAwait(false);
            return item;
        }
        catch (Exception ex)
        {
            Logger.Log(ex, item);
            return null;
        }
    }
}
公共类RedisCache:ICache//自定义接口
{
#地区私人
专用只读IConfiguration\u配置;
专用只读IDatabase\u缓存;
专用只读连接多路复用器连接;
专用只读IRedisTypedClient\u redisClient;
#端域专用
#区域导体
公共RedisCache(IConfiguration配置,IRedisTypedClient redisClient)
{
_配置=配置;
_connection=ConnectionMultiplexer.Connect(configuration.GetSection(“AWS:Cache”)[“Redis:Server”]);
_cache=_connection.GetDatabase();
_redisClient=redisClient;
}
#端区探测器
公共异步任务附加项(客户项)
{
尝试
{
等待任务。运行(()=>_redisClient.GetAndSetValue(item.Id,item))。配置等待(false);
退货项目;
}
捕获(例外情况除外)
{
Logger.Log(例如,项目);
返回null;
}
}
}
依赖项注册

 services.AddScoped<IRedisTypedClient<Customer>>(); //DI Registration
services.addScope()//DI注册
当应用程序运行时,它会抛出错误

无法解析类型“ServiceStack.Redis.Generic.IRedisTypedClient”的服务

所以尝试将DI注册为

services.AddScoped<IRedisTypedClient<Customer>>(di => new RedisTypedClient);
services.AddScoped(di=>newredistypedClient);
但是没有找到这样的东西&编译器抛出构建错误

如何注册此依赖关系


谢谢

最后一段代码更接近您需要的代码,但很明显,这会引发编译时错误。您没有包含泛型类型param,并且缺少括号,即使如此,该类型几乎肯定必须在构造函数中包含一些参数,而您没有提供这些参数。它应该看起来像:

services.AddScoped<IRedisTypedClient<Customer>>(p =>
{
    // Use `p` to get services, config values etc. For example:
    // var config = p.GetRequiredService<IConfiguration>();
    return new RedisTypedClient<Customer>(someParam);
}

同意#2点。但是想知道为什么?你能补充一下我之所以选择这种方式的原因吗?因为
IDistributedCache
没有与
IRedisTypedClient
相同数量的方法来处理缓存,因为它抽象了特定的缓存实现。如果您依赖IDistributedCache,那么您可以随时使用您喜欢的任何底层提供程序,甚至可以在不同环境中使用不同的提供程序(例如,在开发中使用内存缓存)。如果您直接依赖Redis客户端,那么您只能在所有环境中使用Redis。它拥有您所需要的一切,并且是标准应用程序代码的一部分。更高级的场景应该发生在工作者服务或其他方面。谢谢!但我想进一步了解。您在文章中看到的是服务层类,而我的API通过合同进行通信。因此,UI层或任何人在应用程序中使用缓存都不知道背后的缓存机制。你的想法!
services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "localhost";
    options.InstanceName = "SampleInstance";
});