From 7e77078160c0a669a19b82934d8142e319e8e6b4 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 5 Sep 2014 12:53:08 -0700 Subject: [PATCH] Adding in memory caching to the sample --- build.cmd | 4 ++-- .../Controllers/StoreManagerController.cs | 23 +++++++++++++++---- .../Components/AnnouncementComponent.cs | 11 +++++++-- .../Components/CartSummaryComponent.cs | 2 +- .../Controllers/CheckoutController.cs | 2 +- src/MusicStore/Controllers/HomeController.cs | 9 +++++--- src/MusicStore/Controllers/StoreController.cs | 19 ++++++++++----- src/MusicStore/Models/Album.cs | 4 ++-- src/MusicStore/Startup.cs | 5 ++++ src/MusicStore/project.json | 3 ++- 10 files changed, 59 insertions(+), 23 deletions(-) diff --git a/build.cmd b/build.cmd index bcd7883412..96ad29dd2b 100644 --- a/build.cmd +++ b/build.cmd @@ -20,8 +20,8 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_KRE_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\kvm upgrade -x64 -CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x64 +CALL packages\KoreBuild\build\kvm upgrade -amd64 +CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -amd64 CALL packages\KoreBuild\build\kvm install default -x86 CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 diff --git a/src/MusicStore/Areas/Admin/Controllers/StoreManagerController.cs b/src/MusicStore/Areas/Admin/Controllers/StoreManagerController.cs index 6d9ad3e1b8..be77e9c2de 100644 --- a/src/MusicStore/Areas/Admin/Controllers/StoreManagerController.cs +++ b/src/MusicStore/Areas/Admin/Controllers/StoreManagerController.cs @@ -7,6 +7,7 @@ using MusicStore.Models; using System.Linq; using MusicStore.Hubs; using MusicStore.ViewModels; +using Microsoft.AspNet.MemoryCache; namespace MusicStore.Areas.Admin.Controllers { @@ -16,11 +17,13 @@ namespace MusicStore.Areas.Admin.Controllers { private readonly MusicStoreContext db; private IHubContext annoucementHub; + private readonly IMemoryCache cache; - public StoreManagerController(MusicStoreContext context, IConnectionManager connectionManager) + public StoreManagerController(MusicStoreContext context, IConnectionManager connectionManager, IMemoryCache memoryCache) { db = context; annoucementHub = connectionManager.GetHubContext(); + cache = memoryCache; } // @@ -58,12 +61,18 @@ namespace MusicStore.Areas.Admin.Controllers // // GET: /StoreManager/Details/5 - public IActionResult Details(int id = 0) + public IActionResult Details(int id) { - Album album = db.Albums.Single(a => a.AlbumId == id); + string cacheId = string.Format("album_{0}", id); + var album = cache.GetOrAdd(cacheId, context => + { + //If this returns null how do we prevent the cache to store this. + return db.Albums.Single(a => a.AlbumId == id); + }); if (album == null) { + cache.Remove(cacheId); return HttpNotFound(); } @@ -102,7 +111,7 @@ namespace MusicStore.Areas.Admin.Controllers // // GET: /StoreManager/Edit/5 - public IActionResult Edit(int id = 0) + public IActionResult Edit(int id) { Album album = db.Albums.Single(a => a.AlbumId == id); @@ -126,6 +135,8 @@ namespace MusicStore.Areas.Admin.Controllers { db.ChangeTracker.Entry(album).State = EntityState.Modified; db.SaveChanges(); + //Invalidate the cache entry as it is modified + cache.Remove(string.Format("album_{0}", album.AlbumId)); return RedirectToAction("Index"); } @@ -136,7 +147,7 @@ namespace MusicStore.Areas.Admin.Controllers // // GET: /StoreManager/RemoveAlbum/5 - public IActionResult RemoveAlbum(int id = 0) + public IActionResult RemoveAlbum(int id) { Album album = db.Albums.Single(a => a.AlbumId == id); if (album == null) @@ -154,6 +165,8 @@ namespace MusicStore.Areas.Admin.Controllers Album album = db.Albums.Single(a => a.AlbumId == id); db.Albums.Remove(album); db.SaveChanges(); + //Remove the cache entry as it is removed + cache.Remove(string.Format("album_{0}", id)); return RedirectToAction("Index"); } diff --git a/src/MusicStore/Components/AnnouncementComponent.cs b/src/MusicStore/Components/AnnouncementComponent.cs index 79f10ae7ca..17bef7f3c9 100644 --- a/src/MusicStore/Components/AnnouncementComponent.cs +++ b/src/MusicStore/Components/AnnouncementComponent.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Mvc; using MusicStore.Models; +using Microsoft.AspNet.MemoryCache; namespace MusicStore.Components { @@ -10,15 +11,21 @@ namespace MusicStore.Components public class AnnouncementComponent : ViewComponent { private readonly MusicStoreContext db; + private readonly IMemoryCache cache; - public AnnouncementComponent(MusicStoreContext context) + public AnnouncementComponent(MusicStoreContext context, IMemoryCache memoryCache) { db = context; + cache = memoryCache; } public async Task InvokeAsync() { - var latestAlbum = await GetLatestAlbum(); + var latestAlbum = await cache.GetOrAdd("latestAlbum", async context => + { + return await GetLatestAlbum(); + }); + return View(latestAlbum); } diff --git a/src/MusicStore/Components/CartSummaryComponent.cs b/src/MusicStore/Components/CartSummaryComponent.cs index 5769a4ad75..cff3a3a342 100644 --- a/src/MusicStore/Components/CartSummaryComponent.cs +++ b/src/MusicStore/Components/CartSummaryComponent.cs @@ -27,7 +27,7 @@ namespace MusicStore.Components private Task> GetCartItems() { - var cart = ShoppingCart.GetCart(db, this.Context); + var cart = ShoppingCart.GetCart(db, Context); var cartItems = cart.GetCartItems() .Select(a => a.Album.Title) diff --git a/src/MusicStore/Controllers/CheckoutController.cs b/src/MusicStore/Controllers/CheckoutController.cs index f0349e34e7..22550646ef 100644 --- a/src/MusicStore/Controllers/CheckoutController.cs +++ b/src/MusicStore/Controllers/CheckoutController.cs @@ -52,7 +52,7 @@ namespace MusicStore.Controllers db.Orders.Add(order); //Process the order - var cart = ShoppingCart.GetCart(db, this.Context); + var cart = ShoppingCart.GetCart(db, Context); cart.CreateOrder(order); // Save all changes diff --git a/src/MusicStore/Controllers/HomeController.cs b/src/MusicStore/Controllers/HomeController.cs index bbfd4733c9..0740ef5793 100644 --- a/src/MusicStore/Controllers/HomeController.cs +++ b/src/MusicStore/Controllers/HomeController.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNet.Mvc; +using Microsoft.AspNet.MemoryCache; +using Microsoft.AspNet.Mvc; using MusicStore.Models; using System.Collections.Generic; using System.Linq; @@ -8,10 +9,12 @@ namespace MusicStore.Controllers public class HomeController : Controller { private readonly MusicStoreContext db; + private readonly IMemoryCache cache; - public HomeController(MusicStoreContext context) + public HomeController(MusicStoreContext context, IMemoryCache memoryCache) { db = context; + cache = memoryCache; } // @@ -19,7 +22,7 @@ namespace MusicStore.Controllers public IActionResult Index() { // Get most popular albums - var albums = GetTopSellingAlbums(6); + var albums = cache.GetOrAdd("topselling", (context => GetTopSellingAlbums(6))); return View(albums); } diff --git a/src/MusicStore/Controllers/StoreController.cs b/src/MusicStore/Controllers/StoreController.cs index 22e5d77110..db7fc0c108 100644 --- a/src/MusicStore/Controllers/StoreController.cs +++ b/src/MusicStore/Controllers/StoreController.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNet.Mvc; +using Microsoft.AspNet.MemoryCache; +using Microsoft.AspNet.Mvc; using MusicStore.Models; using System.Linq; @@ -7,10 +8,12 @@ namespace MusicStore.Controllers public class StoreController : Controller { private readonly MusicStoreContext db; + private readonly IMemoryCache cache; - public StoreController(MusicStoreContext context) + public StoreController(MusicStoreContext context, IMemoryCache memoryCache) { db = context; + cache = memoryCache; } // @@ -39,11 +42,15 @@ namespace MusicStore.Controllers public IActionResult Details(int id) { - var album = db.Albums.Single(a => a.AlbumId == id); + var album = cache.GetOrAdd(string.Format("album_{0}", id), context => + { + var albumData = db.Albums.Single(a => a.AlbumId == id); - // TODO [EF] We don't query related data as yet. We have to populate this until we do automatically. - album.Genre = db.Genres.Single(g => g.GenreId == album.GenreId); - album.Artist = db.Artists.Single(a => a.ArtistId == album.ArtistId); + // TODO [EF] We don't query related data as yet. We have to populate this until we do automatically. + albumData.Genre = db.Genres.Single(g => g.GenreId == albumData.GenreId); + albumData.Artist = db.Artists.Single(a => a.ArtistId == albumData.ArtistId); + return albumData; + }); return View(album); } diff --git a/src/MusicStore/Models/Album.cs b/src/MusicStore/Models/Album.cs index 6348b7b939..bcd151feda 100644 --- a/src/MusicStore/Models/Album.cs +++ b/src/MusicStore/Models/Album.cs @@ -42,8 +42,8 @@ namespace MusicStore.Models /// public Album() { - this.OrderDetails = new List(); - this.Created = DateTime.UtcNow; + OrderDetails = new List(); + Created = DateTime.UtcNow; } } } \ No newline at end of file diff --git a/src/MusicStore/Startup.cs b/src/MusicStore/Startup.cs index 64b178ac70..7ceb59052f 100644 --- a/src/MusicStore/Startup.cs +++ b/src/MusicStore/Startup.cs @@ -14,6 +14,7 @@ using Microsoft.AspNet.Security.Google; using Microsoft.AspNet.Security.Twitter; using Microsoft.AspNet.Security.MicrosoftAccount; using Microsoft.AspNet.Security; +using Microsoft.AspNet.MemoryCache; namespace MusicStore { @@ -76,6 +77,10 @@ namespace MusicStore //Add all SignalR related services to IoC. services.AddSignalR(); + + //Add InMemoryCache + //Currently not able to AddSingleTon + services.AddInstance(new MemoryCache()); }); //Configure SignalR diff --git a/src/MusicStore/project.json b/src/MusicStore/project.json index 6089d8c3a5..fcea7dc457 100644 --- a/src/MusicStore/project.json +++ b/src/MusicStore/project.json @@ -24,7 +24,8 @@ "EntityFramework.InMemory": "7.0.0-*", "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.AspNet.SignalR.Server": "3.0.0-*" + "Microsoft.AspNet.SignalR.Server": "3.0.0-*", + "Microsoft.AspNet.MemoryCache": "1.0.0-*" }, "commands": { "WebListener": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5002",