2017-02-05 4 views
3

В ASP.NET Ядра его очень легко получить доступ к кэш-памяти из контроллераAsp.Net Core: Использование кэш-памяти вне контроллера

В вашем запуске добавления:

public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddMemoryCache(); 
     } 

, а затем из вашего контроллер

[Route("api/[controller]")] 
public class MyExampleController : Controller 
{ 
    private IMemoryCache _cache; 

    public MyExampleController(IMemoryCache memoryCache) 
    { 
     _cache = memoryCache; 
    } 

    [HttpGet("{id}", Name = "DoStuff")] 
    public string Get(string id) 
    { 
     var cacheEntryOptions = new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromHours(1)); 
     _cache.Set("key", "value", cacheEntryOptions); 
    } 
} 

Но как я могу получить доступ к тому же кэшу памяти вне контроллера. например. У меня есть запланированная задача, инициированная HangFire. Как получить доступ к памяти из моего кода, который запускается с помощью запланированной задачи HangFire?

public class ScheduledStuff 
{ 
    public void RunScheduledTasks() 
    { 
     //want to access the same memorycache here ... 
    } 
} 

ответ

3

Экземпляр кеша памяти может быть введен в любой компонент, который управляется контейнером DI; это означает, что вам нужно настроить ScheduledStuff экземпляр в методе ConfigureServices:

public void ConfigureServices(IServiceCollection services) { 
    services.AddMemoryCache(); 
    services.AddSingleton<ScheduledStuff>(); 
} 

и объявить IMemoryCache в зависимости в ScheduledStuff конструктору:

public class ScheduledStuff { 
    IMemoryCache MemCache; 
    public ScheduledStuff(IMemoryCache memCache) { 
    MemCache = memCache; 
    } 
} 
+0

Спасибо за вашу помощь Виталию. Проблема в том, как я могу запустить метод RunScheduledTasks? Он требует параметра memoryCache. Ошибка \t \t CS7036 Там не аргумент, учитывая, что соответствует требуемому формальному параметру 'MemoryCache' из 'ScheduledStuff.ScheduledStuff (IMemoryCache)' 'ScheduledStuff scheduledStuff = новый ScheduledStuff();' <- Ошибка здесь 'scheduledStuff.RunScheduledTasks (); ' – SpeedBird527

+1

вам не следует создавать экземпляр' SheduledStuff' в вашем коде, вместо этого вам нужно получить его из контейнера DI, указав его как зависимость в контроллере или с помощью HttpContext.RequestServices'. –

Смежные вопросы