我在C#中使用Windows窗体创建了一个程序,架构是这样的
* BaseClass.cs
* EntityClass.cs
* ControllerClass.cs
* DataAccessClass.cs
* Viewer.cs
所以基本上Entity
类继承自基类,数据访问类从MySql数据库中获取和检索数据。
我想要做的是能够使用数据提取,而不必调用数据访问类,如果我已经拉过一次..我在哪里可以放置这些数据,以便我可以在任何地方访问它?..
我正在阅读关于序列化到内存中的内容..但我想在这里得到一个很好的建议,如何放置它,如果可能的话。我真的很感激任何指针。
此致
答案 0 :(得分:1)
似乎您希望继续使用MVC模式,并引入在您的2个视图之间共享的“模型”组件。将使用您的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来查询数据库。
最后,如果模型发生变化,您需要一些方法将更改推送到视图。一种方法是让模型在刷新数据时触发事件,并且每个视图都订阅该事件。
答案 1 :(得分:0)
我建议使用静态类来保存数据。如果您将同时打开多个表单,则可以在静态类中使用某个表单标识符键入的字典。
答案 2 :(得分:0)
你不需要序列化任何东西,你可以只保留某种缓存层中的引用。
假设您的数据访问类将某种查询作为参数,您可以将结果存储在由查询键入的字典中。然后首先检查缓存中的查询结果,如果没有,则转到数据库,检索并缓存它。如果您正在为查询使用lambda表达式,则可以调用.GetHashCode()方法来获取该lambda的唯一哈希值。
EX:
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]
}
答案 3 :(得分:0)
我建议你看一下System.Runtime.Caching.MemoryCache类。它可能满足您的需求。