Как сделать IMemoryCache доступным на всех контроллерах? - PullRequest
0 голосов
/ 11 июля 2019

Я следовал этому уроку https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-2.2

Используется Dependency Injection, чтобы IMemoryCache был доступен только в конкретном контроллере, например

public class TController : ControllerBase
{
    public IConfiguration Configuration { get; }

    private IMemoryCache _cache;

    public TController(IConfiguration configuration, IMemoryCache memoryCache)
    {
        Configuration = configuration;
        _cache = memoryCache;
    }

    public IActionResult GetAccessToken()
    {

        string key ="IDGKey";
        string obj;
        if (!cache.TryGetValue<string>(key, out obj))
        {
            obj = DateTime.Now.ToString();
            _cache.Set<string>(key, obj);
        }
        return obj;

    }
}

Теперь, если я пытаюсь получить доступ к значению _cache в том же пространстве имен или в другом контроллере

public class RController : ControllerBase
{
    public IActionResult R()
    {
        var cb = _cache.Get("IDGKey");
        return Ok(cb);
    }
}

выдает следующую ошибку -

Имя '_cache' не существует в текущем контексте (CS0103)

Как сделать _cache доступным для всех контроллеров?

1 Ответ

1 голос
/ 11 июля 2019

Прежде всего вам нужно определить некоторый базовый класс контроллера, который использует IMemoryCache

public abstract class MyBaseController : ControllerBase
{
    public IConfiguration Configuration { get; }
    protected IMemoryCache _memoryCache;

    public MyBaseController(IConfiguration configuration, IMemoryCache memoryCache)
    {
        Configuration = configuration;
        _memoryCache = memoryCache;
    }
}

Тогда унаследуйте от него ваши контроллеры и не забудьте вызвать конструктор базового класса для создания экземпляра IMemoryCache

public class MyController : MyBaseController
{
    public MyController(IConfiguration configuration, IMemoryCache memoryCache): base(configuration, memoryCache)
    {
    }

    public IActionResult Action()
    {
        var value = _memoryCache.Get("some key");
        return Ok();
    }
}
...