浏览代码

Added Dynamic Filename selection to CoreRepository

frankvandenbos 6 月之前
父节点
当前提交
870d03fb2f
共有 1 个文件被更改,包括 18 次插入11 次删除
  1. 18 11
      InABox.Avalonia/DataModels/CoreRepository.cs

+ 18 - 11
InABox.Avalonia/DataModels/CoreRepository.cs

@@ -24,13 +24,13 @@ namespace InABox.Avalonia
 
     public delegate void CoreRepositoryItemCreatedEvent<TShell>(object sender, CoreRepositoryItemCreatedArgs<TShell> args);
 
-    public class CoreRepository
+    public abstract class CoreRepository
     {
-        public static bool IsCached(string filename) => 
+        public static bool IsCached(string? filename) => 
             !String.IsNullOrWhiteSpace(filename) 
             && File.Exists(CacheFileName(filename));
         
-        public static string CacheFileName(string filename) =>
+        public static string CacheFileName(string? filename) =>
             Path.Combine(CacheFolder(), filename);
 
         public static string CacheFolder()
@@ -43,7 +43,9 @@ namespace InABox.Avalonia
             return result;
         }
 
-        public static Guid CacheID { get; set; } 
+        public static Guid CacheID { get; set; }
+
+        public abstract string DefaultFileName();
 
     }
     
@@ -65,10 +67,11 @@ namespace InABox.Avalonia
         
         public DateTime LastUpdated { get; protected set; }
         
-        public String FileName { get; set; }
+        public Func<string>? FileName { get; }
 
+        public override string DefaultFileName() => typeof(TEntity).Name + ".db";
         
-        protected CoreRepository(IModelHost host, Func<Filter<TEntity>> filter)
+        protected CoreRepository(IModelHost host, Func<Filter<TEntity>> filter, Func<string>? filename = null)
         {
             AllItems = new CoreObservableCollection<TItem>();
             AllItems.CollectionChanged += (sender, args) => ItemsChanged(AllItems);
@@ -83,6 +86,7 @@ namespace InABox.Avalonia
             Reset();
             Host = host;
             Filter = filter;
+            FileName = filename;
         }
 
         protected virtual void ItemsChanged(IEnumerable<TItem> items)
@@ -193,7 +197,8 @@ namespace InABox.Avalonia
             Items.Clear();
             SelectedItems.Clear();
 
-            if (!Loaded && CoreRepository.IsCached(FileName))
+            var filename = FileName?.Invoke();
+            if (!Loaded && CoreRepository.IsCached(filename))
             {
                 DoBeforeLoad();
                 if (LoadFromStorage())
@@ -510,13 +515,14 @@ namespace InABox.Avalonia
         
         protected bool LoadFromStorage()
         {
-            if (String.IsNullOrWhiteSpace(FileName))
+            var filename = FileName?.Invoke();
+            if (String.IsNullOrWhiteSpace(filename))
             {
                 InitializeTables();
                 return true;
             }
             
-            var file = CacheFileName(FileName);
+            var file = CacheFileName(filename);
             if (File.Exists(file))
             {
                 LastUpdated = File.GetLastWriteTime(file);
@@ -556,7 +562,8 @@ namespace InABox.Avalonia
 
         protected void SaveToStorage()
         {
-            if (String.IsNullOrWhiteSpace(FileName))
+            var filename = FileName?.Invoke();
+            if (String.IsNullOrWhiteSpace(filename))
                 return;
             
             QueryStorage storage = new QueryStorage();
@@ -566,7 +573,7 @@ namespace InABox.Avalonia
             var data = storage.WriteBinary(BinarySerializationSettings.Latest);
             try
             {
-                var file = CacheFileName(FileName);
+                var file = CacheFileName(filename);
                 File.WriteAllBytes(file,data);
             }
             catch (Exception e)