Конструктор не вызывается в классе - PullRequest
0 голосов
/ 14 января 2019

Я создаю помощник в .net core 2.2 для кэширования в Redis. Когда я вызываю метод Add, он не проходит через мой конструктор для создания экземпляра IDistributedCache.

public class Cache
{
    public static IDistributedCache _cache;
    public Cache(IDistributedCache cache)
    {
        _cache = cache;
    }
    public static void Add(string key, byte[] value, int expiration)
    {
        var options = new DistributedCacheEntryOptions()
            .SetSlidingExpiration(TimeSpan.FromSeconds(expiration));
        _cache.Set(key, value, options);
    }
}

Я не совсем понимаю, чего мне не хватает. Я называю метод как таковой

Cache.Add("time", encodedCurrentTimeUTC, expiration);

EDIT: Я удалил статические записи

public class Cache
{
    public IDistributedCache _cache;
    public Cache(IDistributedCache cache)
    {
        _cache = cache;
    }
    public void Add(string key, byte[] value, int expiration)
    {
        var options = new DistributedCacheEntryOptions()
            .SetAbsoluteExpiration(TimeSpan.FromSeconds(expiration));
        _cache.Set(key, value, options);
    }
}

Но когда я пытаюсь вызвать метод

var newItem = new Cache();
newItem.Add("time", encodedCurrentTimeUTC, expiration);

Это говорит мне, что я не передаю параметр в конструктор кэша.

1 Ответ

0 голосов
/ 14 января 2019

Поскольку вы используете DI, избегайте использования new в целом. Пусть ваш класс Cache реализует такой интерфейс, как:

public interface ICache
{
    void Add(string key, byte[] value, int expiration);
}

public class Cache : ICache
{
    public IDistributedCache _cache;
    public Cache(IDistributedCache cache)
    {
        _cache = cache;
    }
    public void Add(string key, byte[] value, int expiration)
    {
        var options = new DistributedCacheEntryOptions()
            .SetAbsoluteExpiration(TimeSpan.FromSeconds(expiration));
        _cache.Set(key, value, options);
    }
}

Зарегистрируйтесь Cache как ICache в своем контейнере. AutoFac пример:

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<Cache>().As<ICache>();

Затем в классе, где вам нужно использовать объект Cache, внедрите его как зависимость:

class ClassThatNeedsACache
{
    ICache _cache;
    ClassThatNeedsACache(ICache cache)
    {
        _cache = cache;
    }

    void MethodThatUsesACache()
    {
        // Some other code to create your encodedCurrentTimeUTC and expiration
        _cache.Add("time", encodedCurrentTimeUTC, expiration);
    }
}

Фреймворки внедрения зависимостей объединяют все вместе в корне вашей композиции, например, Global.asax в ASP.NET и поддерживайте создание и время жизни объектов в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...