From 6435591d1cc0a9b27182337b5ae572770973b784 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Tue, 29 Mar 2016 14:38:23 -0700 Subject: [PATCH] Created a configurable memory cache --- .../Controllers/StoreManagerController.cs | 19 +++++++++----- src/MusicStore/Controllers/HomeController.cs | 22 +++++++++++----- src/MusicStore/Controllers/StoreController.cs | 19 +++++++++----- src/MusicStore/Properties/AppSettings.cs | 2 ++ src/MusicStore/config.json | 23 ++++++++-------- test/MusicStore.Test/HomeControllerTest.cs | 7 ++--- test/MusicStore.Test/StoreControllerTest.cs | 15 +++++++---- test/MusicStore.Test/TestAppSettings.cs | 26 +++++++++++++++++++ 8 files changed, 96 insertions(+), 37 deletions(-) create mode 100644 test/MusicStore.Test/TestAppSettings.cs diff --git a/src/MusicStore/Areas/Admin/Controllers/StoreManagerController.cs b/src/MusicStore/Areas/Admin/Controllers/StoreManagerController.cs index 059c5c6714..6ae41ca8d7 100644 --- a/src/MusicStore/Areas/Admin/Controllers/StoreManagerController.cs +++ b/src/MusicStore/Areas/Admin/Controllers/StoreManagerController.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.Options; using MusicStore.Models; using MusicStore.ViewModels; @@ -17,9 +18,12 @@ namespace MusicStore.Areas.Admin.Controllers [Authorize("ManageStore")] public class StoreManagerController : Controller { - public StoreManagerController(MusicStoreContext dbContext) + private readonly AppSettings _appSettings; + + public StoreManagerController(MusicStoreContext dbContext, IOptions options) { DbContext = dbContext; + _appSettings = options.Value; } public MusicStoreContext DbContext { get; } @@ -55,11 +59,14 @@ namespace MusicStore.Areas.Admin.Controllers if (album != null) { - //Remove it from cache if not retrieved in last 10 minutes. - cache.Set( - cacheKey, - album, - new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(10))); + if (_appSettings.CacheDbResults) + { + //Remove it from cache if not retrieved in last 10 minutes. + cache.Set( + cacheKey, + album, + new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(10))); + } } } diff --git a/src/MusicStore/Controllers/HomeController.cs b/src/MusicStore/Controllers/HomeController.cs index 5f0499ceda..992a4f25ba 100644 --- a/src/MusicStore/Controllers/HomeController.cs +++ b/src/MusicStore/Controllers/HomeController.cs @@ -5,12 +5,19 @@ 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 options) + { + _appSettings = options.Value; + } // // GET: /Home/ public async Task Index( @@ -26,14 +33,17 @@ namespace MusicStore.Controllers if (albums != null && albums.Count > 0) { - // 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() + 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)); + } } } diff --git a/src/MusicStore/Controllers/StoreController.cs b/src/MusicStore/Controllers/StoreController.cs index 7cdb033238..dfa2336fe1 100644 --- a/src/MusicStore/Controllers/StoreController.cs +++ b/src/MusicStore/Controllers/StoreController.cs @@ -4,15 +4,19 @@ 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 StoreController : Controller { - public StoreController(MusicStoreContext dbContext) + private readonly AppSettings _appSettings; + + public StoreController(MusicStoreContext dbContext, IOptions options) { DbContext = dbContext; + _appSettings = options.Value; } public MusicStoreContext DbContext { get; } @@ -60,11 +64,14 @@ namespace MusicStore.Controllers if (album != null) { - //Remove it from cache if not retrieved in last 10 minutes - cache.Set( - cacheKey, - album, - new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(10))); + if (_appSettings.CacheDbResults) + { + //Remove it from cache if not retrieved in last 10 minutes + cache.Set( + cacheKey, + album, + new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(10))); + } } } diff --git a/src/MusicStore/Properties/AppSettings.cs b/src/MusicStore/Properties/AppSettings.cs index ce51983a25..6ba3600617 100644 --- a/src/MusicStore/Properties/AppSettings.cs +++ b/src/MusicStore/Properties/AppSettings.cs @@ -3,5 +3,7 @@ public class AppSettings { public string SiteTitle { get; set; } + + public bool CacheDbResults { get; set; } = true; } } \ No newline at end of file diff --git a/src/MusicStore/config.json b/src/MusicStore/config.json index e67e7d02d0..6c33b8a48d 100644 --- a/src/MusicStore/config.json +++ b/src/MusicStore/config.json @@ -1,14 +1,15 @@ { - "AppSettings": { - "SiteTitle": "ASP.NET MVC Music Store" - }, - "DefaultAdminUsername": "Administrator@test.com", - "DefaultAdminPassword": "YouShouldChangeThisPassword1!", - "Data": { - "DefaultConnection": { - // Use a shared (and running) LocalDB database when executing in IIS e.g. - // "Server=(localdb)\\.\\IIS_DB;Database=MusicStore;Trusted_Connection=False;MultipleActiveResultSets=true;User ID=iis_login;Password=********" - "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=MusicStore;Trusted_Connection=True;MultipleActiveResultSets=true;Connect Timeout=30;" - } + "AppSettings": { + "SiteTitle": "ASP.NET MVC Music Store", + "CacheDbResults": true + }, + "DefaultAdminUsername": "Administrator@test.com", + "DefaultAdminPassword": "YouShouldChangeThisPassword1!", + "Data": { + "DefaultConnection": { + // Use a shared (and running) LocalDB database when executing in IIS e.g. + // "Server=(localdb)\\.\\IIS_DB;Database=MusicStore;Trusted_Connection=False;MultipleActiveResultSets=true;User ID=iis_login;Password=********" + "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=MusicStore;Trusted_Connection=True;MultipleActiveResultSets=true;Connect Timeout=30;" } + } } \ No newline at end of file diff --git a/test/MusicStore.Test/HomeControllerTest.cs b/test/MusicStore.Test/HomeControllerTest.cs index 16c7cba620..d1176be5e2 100644 --- a/test/MusicStore.Test/HomeControllerTest.cs +++ b/test/MusicStore.Test/HomeControllerTest.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using MusicStore.Models; +using MusicStore.Test; using Xunit; namespace MusicStore.Controllers @@ -30,7 +31,7 @@ namespace MusicStore.Controllers public void Error_ReturnsErrorView() { // Arrange - var controller = new HomeController(); + var controller = new HomeController(new TestAppSettings()); var errorView = "~/Views/Shared/Error.cshtml"; // Act @@ -48,7 +49,7 @@ namespace MusicStore.Controllers // Arrange var dbContext = _serviceProvider.GetRequiredService(); var cache = _serviceProvider.GetRequiredService(); - var controller = new HomeController(); + var controller = new HomeController(new TestAppSettings()); PopulateData(dbContext); // Action @@ -69,7 +70,7 @@ namespace MusicStore.Controllers public void StatusCodePage_ReturnsStatusCodePage() { // Arrange - var controller = new HomeController(); + var controller = new HomeController(new TestAppSettings()); var statusCodeView = "~/Views/Shared/StatusCodePage.cshtml"; // Action diff --git a/test/MusicStore.Test/StoreControllerTest.cs b/test/MusicStore.Test/StoreControllerTest.cs index 9e9d955455..090d2ebd02 100644 --- a/test/MusicStore.Test/StoreControllerTest.cs +++ b/test/MusicStore.Test/StoreControllerTest.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using MusicStore.Models; +using MusicStore.Test; using Xunit; namespace MusicStore.Controllers @@ -33,7 +34,7 @@ namespace MusicStore.Controllers var dbContext = _serviceProvider.GetRequiredService(); CreateTestGenres(numberOfGenres: 10, numberOfAlbums: 1, dbContext: dbContext); - var controller = new StoreController(dbContext); + var controller = new StoreController(dbContext, new TestAppSettings()); // Act var result = await controller.Index(); @@ -51,7 +52,9 @@ namespace MusicStore.Controllers public async Task Browse_ReturnsHttpNotFoundWhenNoGenreData() { // Arrange - var controller = new StoreController(_serviceProvider.GetRequiredService()); + var controller = new StoreController( + _serviceProvider.GetRequiredService(), + new TestAppSettings()); // Act var result = await controller.Browse(string.Empty); @@ -69,7 +72,7 @@ namespace MusicStore.Controllers var dbContext = _serviceProvider.GetRequiredService(); CreateTestGenres(numberOfGenres: 3, numberOfAlbums: 3, dbContext: dbContext); - var controller = new StoreController(dbContext); + var controller = new StoreController(dbContext, new TestAppSettings()); // Act var result = await controller.Browse(genreName); @@ -90,7 +93,9 @@ namespace MusicStore.Controllers { // Arrange var albumId = int.MinValue; - var controller = new StoreController(_serviceProvider.GetRequiredService()); + var controller = new StoreController( + _serviceProvider.GetRequiredService(), + new TestAppSettings()); // Act var result = await controller.Details(_serviceProvider.GetRequiredService(), albumId); @@ -110,7 +115,7 @@ namespace MusicStore.Controllers var cache = _serviceProvider.GetRequiredService(); - var controller = new StoreController(dbContext); + var controller = new StoreController(dbContext, new TestAppSettings()); // Act var result = await controller.Details(cache, albumId); diff --git a/test/MusicStore.Test/TestAppSettings.cs b/test/MusicStore.Test/TestAppSettings.cs new file mode 100644 index 0000000000..8e87882462 --- /dev/null +++ b/test/MusicStore.Test/TestAppSettings.cs @@ -0,0 +1,26 @@ +using Microsoft.Extensions.Options; + +namespace MusicStore.Test +{ + public class TestAppSettings : IOptions + { + private readonly AppSettings _appSettings; + + public TestAppSettings(bool storeInCache = true) + { + _appSettings = new AppSettings() + { + SiteTitle = "ASP.NET MVC Music Store", + CacheDbResults = storeInCache + }; + } + + public AppSettings Value + { + get + { + return _appSettings; + } + } + } +}