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;