Я беру небольшие значения таблицы поиска из базы данных Entity Framework и сохраняю в MemoryCache. В настоящее время используются оба способа, обычный memoryCache и Singleton MemoryContainer, которые можно увидеть здесь Ядро Asp.Net: использовать кэш памяти вне контроллера .
In Домашний контроллер , это сохраняет ProductTypes вMemoryCache, и мы видим, что значения правильно хранятся в окне отладки (ProductType, ProductName и т. д.).
public class HomeController : Controller
{
public IMemoryCache _memoryCache;
public readonly StoreContext _storeContext;
public MemoryContainer _memoryContainer;
public HomeController(StoreContext storeContext, IMemoryCache memoryCache, MemoryContainer memoryContainer)
{
_storeContext= storeContext;
_memoryCache = memoryCache;
_memoryContainer = memoryContainer;
}
public IActionResult Index()
{
var productTypes = storeContext.ProductTypes;
_memoryCache.Set("ProductTypesKey", productTypes );
_memoryContainer._memoryCache.Set("ProductTypesKey2", test);
return View(); //both values store correctly
}
Затем при переходе к ProductController ,
public class ProductsController : Controller
{
public StoreContext _storeContext;
public IMemoryCache _memoryCache;
public MemoryContainer _memoryContainer;
public ProductsController(StoreContext storeContext, IMemoryCache memoryCache, MemoryContainer memoryContainer)
{
_storeContext = storeContext;
_memoryCache = memoryCache;
_memoryContainer = memoryContainer;
}
public async Task<IActionResult> Details(int? id)
{
var test = _memoryCache.Get<DbSet<ProductTypes>>("ProductTypesKey");
var test2 = _memoryContainer._memoryCache.Get<DbSet<ProductTypes>>("ProductTypesKey2");
Я вижу следующий результат ошибки в MemoryCache для обоих, как это можно исправить?
Как сделать так, чтобы MemoryCache правильно получал / сохранял с DbContext, независимо от перехода от Контроллера к Контроллеру?
"Невозможно получить доступ к удаленному объекту. Распространенной причиной этой ошибки является удаление контекста, который был разрешен путем внедрения зависимости, а затем попытка использовать тот же экземпляр контекста в другом месте вашего приложения. Это может произойти, если вы вызываете Dispose() для контекста или обертывание контекста в операторе using. Если вы используете зависимость, введитеИон, вы должны позволить контейнеру внедрения зависимости позаботиться об удалении экземпляров контекста. \ r \ nИмя объекта: 'StoreContext'. "
Другой код:
public class MemoryContainer
{
public IMemoryCache _memoryCache { get; set; }
public MemoryContainer(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
}
Запуск. cs
services.AddMemoryCache();
services.AddSingleton<MemoryContainer>();
Другие ресурсы:
MVC Net Core Pass MemoryCache для всех контроллеров