如何存储数据或在表单中保存数据

时间:2012-03-23 17:00:03

标签: c# mysql winforms

我在C#中使用Windows窗体创建了一个程序,架构是这样的

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

所以基本上Entity类继承自基类,数据访问类从MySql数据库中获取和检索数据。

我想要做的是能够使用数据提取,而不必调用数据访问类,如果我已经拉过一次..我在哪里可以放置这些数据,以便我可以在任何地方访问它?..

我正在阅读关于序列化到内存中的内容..但我想在这里得到一个很好的建议,如何放置它,如果可能的话。我真的很感激任何指针。

此致

4 个答案:

答案 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类。它可能满足您的需求。