Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using MusicStore.Models;
namespace MusicStore.Features
public class HomeController : Controller
private readonly IMediator _mediator;
public HomeController(IMediator mediator)
_mediator = mediator;
public async Task<IActionResult> Home()
var viewModel = await _mediator.SendAsync(new Home());
return View(viewModel);
public class Home : IAsyncRequest<List<Album>> { }
public class HomeHandler : IAsyncRequestHandler<Home, List<Album>>
private readonly MusicStoreContext _dbContext;
private readonly IMemoryCache _cache;
private readonly IOptions<AppSettings> _options;
public HomeHandler(MusicStoreContext dbContext, IMemoryCache cache, IOptions<AppSettings> options)
_dbContext = dbContext;
_cache = cache;
_options = options;
public async Task<List<Album>> Handle(Home message)
// Get most popular albums
var cacheKey = "topselling";
List<Album> albums;
if (!_cache.TryGetValue(cacheKey, out albums))
albums = await _dbContext.Albums
.OrderByDescending(a => a.OrderDetails.Count)
if (albums != null && albums.Count > 0)
if (_options.Value.CacheDbResults)
// Refresh it every 10 minutes.
// Let this be the last item to be removed by cache if cache GC kicks in.
new MemoryCacheEntryOptions()
return albums;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.