Не удается разрешить службу для типа 'ServiceStack.Redis.Generic.IRedisTypedClient в ASP.Net Core. - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть ASP.Net Core 2.1 приложение. Необходимо использовать 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;
        }
    }
}

Регистрация зависимостей

 services.AddScoped<IRedisTypedClient<Customer>>(); //DI Registration

Когдаприложение запускается, выдает ошибку

Невозможно разрешить службу для типа 'ServiceStack.Redis.Generic.IRedisTypedClient

Поэтому попытался зарегистрировать DI как

services.AddScoped<IRedisTypedClient<Customer>>(di => new RedisTypedClient);

но ничего такого не найдено и компилятор выдает ошибку сборки.

Как зарегистрировать эту IRedisTypedClient зависимость?

Спасибо!

1 Ответ

1 голос
/ 30 сентября 2019

Последний бит кода ближе к тому, что вам нужно, но совершенно очевидно, почему это приводит к ошибке времени компиляции. Вы не включаете параметр универсального типа, а круглые скобки отсутствуют, и даже тогда этот тип почти наверняка должен принимать некоторые параметры в конструкторе, который вы не предоставляете. Это должно выглядеть примерно так:

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

Тем не менее, для кеша не следует использовать Redis напрямую. Вы должны ввести IDistributedCache, а затем включить провайдер кэша Redis :

services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "localhost";
    options.InstanceName = "SampleInstance";
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...