From 24e7c490307e6a4d6ddf86dc5fd9f9bf63cddda0 Mon Sep 17 00:00:00 2001 From: Christian Kauer Date: Sun, 31 Dec 2023 14:15:51 +0100 Subject: [PATCH] dev --- .../CacheProxy/CachedExpenseRepository.cs | 43 +++++++++++++++++++ GameData/GameData.csproj | 2 + GameData/Repository/ExpenseRepository.cs | 19 ++------ KoogleCli/KoogleCli.csproj | 1 + KoogleCli/Program.cs | 26 ++++++++--- 5 files changed, 71 insertions(+), 20 deletions(-) create mode 100644 GameData/CacheProxy/CachedExpenseRepository.cs diff --git a/GameData/CacheProxy/CachedExpenseRepository.cs b/GameData/CacheProxy/CachedExpenseRepository.cs new file mode 100644 index 0000000..aef983f --- /dev/null +++ b/GameData/CacheProxy/CachedExpenseRepository.cs @@ -0,0 +1,43 @@ +using GameData.Repository; +using GameModel; +using GameModel.Contract; +using Microsoft.Extensions.Caching.Memory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Caching; +using System.Text; +using System.Threading.Tasks; + +namespace GameData.CacheProxy +{ + /// + /// cache for repository data, implemented as proxy not as decorator https://www.youtube.com/watch?v=nmAE-JzNSEw + /// + public class CachedExpenseRepository : IExpenseRepository + { + IMemoryCache _cache; + ExpenseRepository _repository; + + public CachedExpenseRepository(ExpenseRepository repository, IMemoryCache cache) + { + _repository = repository; + _cache = cache; + } + + public Task Delete(IEnumerable enumerable) + { + return _repository.Delete(enumerable); + } + + public Task> GetAll() + { + return _cache.GetOrCreateAsync("allexpenses", factory => _repository.GetAll()); + } + + public Task Save(PlayerExpense data) + { + return _repository.Save(data); + } + } +} diff --git a/GameData/GameData.csproj b/GameData/GameData.csproj index ac88806..66616c2 100644 --- a/GameData/GameData.csproj +++ b/GameData/GameData.csproj @@ -8,8 +8,10 @@ + + diff --git a/GameData/Repository/ExpenseRepository.cs b/GameData/Repository/ExpenseRepository.cs index 287d043..4218893 100644 --- a/GameData/Repository/ExpenseRepository.cs +++ b/GameData/Repository/ExpenseRepository.cs @@ -18,9 +18,7 @@ namespace GameData.Repository string UrlExpense => "items/expense"; string UrlPlayerExpense => "items/playerexpense"; - List _memberExpenses = new List(); - - private List _expenses = null; + List _memberExpenses = new List(); public ExpenseRepository(ILogger log, ApiClient apiClient) { @@ -32,18 +30,9 @@ namespace GameData.Repository public async Task> GetAll() { - if (_expenses == null) - { - _log?.LogDebug("loading expenses from api"); - var res = await _apiClient.Get(UrlExpense); - _expenses = new List { }; - _expenses.AddRange(res); - } - else - { - _log?.LogDebug("returning expenses from cache"); - } - return _expenses; + _log?.LogDebug("loading expenses from api"); + var res = await _apiClient.Get(UrlExpense); + return res; } public async Task Save(PlayerExpense memberExpense) diff --git a/KoogleCli/KoogleCli.csproj b/KoogleCli/KoogleCli.csproj index 79f2981..01a8966 100644 --- a/KoogleCli/KoogleCli.csproj +++ b/KoogleCli/KoogleCli.csproj @@ -21,6 +21,7 @@ + diff --git a/KoogleCli/Program.cs b/KoogleCli/Program.cs index 0d696fc..f273471 100644 --- a/KoogleCli/Program.cs +++ b/KoogleCli/Program.cs @@ -4,6 +4,7 @@ using Autofac.Core; using AutofacSerilogIntegration; using CommandLine; using GameData; +using GameData.CacheProxy; using GameData.Dummy; using GameData.Repository; using GameHandler; @@ -15,9 +16,11 @@ using GameModel.Contracts; using GameModel.DeathGame; using GameModel.Settings; using KoogleCli.Model; +using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Serilog; using Spectre.Console; using Spectre.Console.Json; @@ -53,9 +56,13 @@ Autofac.IContainer Register() RegisterAppsettings(builder); RegisterLogging(builder); - + var test = new MemoryCache(new MemoryCacheOptions()); builder.RegisterType(); - builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().InstancePerLifetimeScope(); + builder.RegisterInstance(new MemoryCacheOptions()).As>(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); return builder.Build(); } @@ -136,9 +143,18 @@ void StartGameAction(string gameName, Guid gameId) if (gameId.Equals(Guid.Empty)) { - var starttask = _gs.Start(new[] { 1, 2, 3, 4 }, GetGameSettings(gameName), gameName); - gameState = starttask.Result; - } else + try + { + var starttask = _gs.Start(new[] { 1, 2, 3, 4 }, GetGameSettings(gameName), gameName); + gameState = starttask.Result; + + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + else { var starttask = _gs.Load(gameId); gameState = starttask.Result;