如何存储数据或跨表单持久化数据
本文关键字:数据 表单 持久化 何存储 存储 | 更新日期: 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类。它可能满足你的需要。