aspnetcore/samples/MusicStore/Controllers/HomeController.cs

79 lines
2.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using MusicStore.Models;
namespace MusicStore.Controllers
{
public class HomeController : Controller
{
private readonly AppSettings _appSettings;
public HomeController(IOptions<AppSettings> options)
{
_appSettings = options.Value;
}
//
// GET: /Home/
public async Task<IActionResult> Index(
[FromServices] MusicStoreContext dbContext,
[FromServices] IMemoryCache cache)
{
// Get most popular albums
var cacheKey = "topselling";
List<Album> albums;
if (!cache.TryGetValue(cacheKey, out albums))
{
albums = await GetTopSellingAlbumsAsync(dbContext, 6);
if (albums != null && albums.Count > 0)
{
if (_appSettings.CacheDbResults)
{
// Refresh it every 10 minutes.
// Let this be the last item to be removed by cache if cache GC kicks in.
cache.Set(
cacheKey,
albums,
new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromMinutes(10))
.SetPriority(CacheItemPriority.High));
}
}
}
return View(albums);
}
public IActionResult Error()
{
return View("~/Views/Shared/Error.cshtml");
}
public IActionResult StatusCodePage()
{
return View("~/Views/Shared/StatusCodePage.cshtml");
}
public IActionResult AccessDenied()
{
return View("~/Views/Shared/AccessDenied.cshtml");
}
private Task<List<Album>> GetTopSellingAlbumsAsync(MusicStoreContext dbContext, int count)
{
// Group the order details by album and return
// the albums with the highest count
return dbContext.Albums
.OrderByDescending(a => a.OrderDetails.Count)
.Take(count)
.ToListAsync();
}
}
}