如何存储数据或跨表单持久化数据

本文关键字:数据 表单 持久化 何存储 存储 | 更新日期: 2023-09-27 18:28:44

我用C#中的Windows窗体创建了一个程序,其体系结构类似于

* BaseClass.cs
* EntityClass.cs
* ControllerClass.cs
* DataAccessClass.cs
* Viewer.cs

因此,基本上Entity类继承自基类,数据访问类从MySql数据库中检索数据。

我想做的是,如果我已经提取了一次数据,那么就可以使用提取的数据,而不必调用数据访问类。。我可以把这些数据放在哪里,这样我就可以在任何地方访问它?。。

我在读关于序列化到内存的文章。。但我想在这里得到一个很好的建议,告诉你把它放在哪里,如果可能的话,怎么放。如果有任何建议,我将不胜感激。

问候

如何存储数据或跨表单持久化数据

似乎您想继续使用MVC模式,并引入一个在两个视图之间共享的"Model"组件。将使用DataAccessClass初始化/刷新模型。每个表单(或视图)都应该有一个对模型的引用。我不建议使用序列化,因为您只是在两个不同的窗体之间的同一进程中共享内存中的C#对象。

例如:

public class MyFirstView : Form
{    
  private ModelClass m_model;
  public MyFirstView(ModelClass model)
  {
     m_model = model;
     m_model.OnDataRefresh += this.Model_OnDataRefresh;
  }   
}
public class MySecondView : Form
{    
  private ModelClass m_model;
  public MySecondView(ModelClass model)
  {
     m_model = model;
     m_model.OnDataRefresh += this.Model_OnDataRefresh; 
  }   
}
public class ModelClass 
{
   private DataAccessClass m_dataAccess;
   public event EventHandler OnDataRefresh = {}; // fired when data is refreshed
   public void EnsureDataIsLoaded();  // queries the db if we haven't already
   public void RefreshData(); // refreshes the data from the db
   public IList<Entity> GetDataList(); // access to data items
}

对于每个窗体/视图,可以使用Form.Load事件使用模型数据刷新视图。也许你可以在ModelClass.EnsureDataIsLoaded()上有一个方法,如果你还没有的话,它将使用DataAccessClass来查询数据库。

最后,如果模型发生了更改,则需要某种方法将更改推送到视图中。一种方法是让模型在刷新数据时激发一个事件,并且每个视图都订阅该事件。

我建议使用静态类来保存数据。如果同时打开多个表单,则可以在静态类中使用某个表单标识符键控的Dictionary。

您不需要序列化任何内容,只需在某种缓存层中保留引用即可。

假设您的数据访问类将某种查询作为参数,则可以将结果存储在由查询键入的字典中。然后,您首先检查缓存中的查询结果,如果没有,请转到数据库,检索并缓存它。如果您在查询中使用lambda表达式,则可以调用.GetHashCode()方法来获取该lambda的唯一哈希。

例如:

IDictionary<string, IEnumerable<T>> Cache;
IEnumerable<T> GetData<T>(string query)
{
    var key = typeof(T).Name + query;
    if (!this.Cache.ContainsKey(key))
    {
        // get from database
        var data = SomeRepository.GetData(query);
        this.Cache[key] = value;
    }
    return this.Cache[key]
}

我建议您查看System.Runtime.Caching.MemoryCache类。它可能满足你的需要。