2011-02-28 61 views
2

在我的应用程序中,我有一个DataSet可以保存以不同形式使用的表格,遍及我的应用程序。 为了能够形式之间保持并发性,并且不必每次用户打开一个新的形式,时间从数据库中获取数据,我认为我的数据集作为一个静态字段在程序类是这样的:使用静态数据集作为数据源

static class Program 
{ 
    public static CustomDataSet StockDataSet { get; private set; } 

    [STAThread] 
    static void Main() 
    { 
     StockDataSet = new Database.CustomDataSet(); 
     StockDataSet.InitRelations(); 
     StockDataSet.EnforceConstraints = false; 
     StockDataSet.Categories.Fill(); 
     StockDataSet.Suppliers.Fill(); 
     StockDataSet.StockItems.Fill(); 
     StockDataSet.EnforceConstraints = true; 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainWindow()); 
    } 

这使得以编程方式使用DataSet变得非常容易。然而,在设计阶段工作会造成挫折感。考试;我有一个绑定到BindingSource的DataGridView。如果我希望能够在设计时使用DataGridView的列,那么我必须让我的自定义DataSet的对象可以在InitializeComponent中的BindingSource中访问。

我想到的所有解决方法都是相当丑陋的黑客。 就像在Designer.cs中使用虚拟对象来保持设计时愉快一样,然后将静态对象分配给包含虚拟对象的字段。之后,重置构造函数中的所有绑定。这必须被认为是非常糟糕的做法,对吗?

所以我的问题是这样的:是不是有一个更优雅,或至少有实际的方法呢? 还是有任何建议的最佳做法与多种形式的数据集一起工作?

编辑
股票库存与库存相关。对数据不做重大处理,数据保存在本地服务器上的MySql数据库中。

+0

我真的希望你不要做任何线程 - 这将是纯粹的混乱与静态数据集 – 2011-02-28 13:06:17

+0

不,没有线程。幸运的是 – JonC 2011-02-28 13:09:27

回答

2

显示在运行一个数据源评相应的部分,以及其他在设计时是根本不难看。我认为在使用DataTables,DataSets和DataGridViews以及设计器时,你所面对的是相当普遍的。如果使用非常简单的主/表格形式并且不希望超出标准行为,那么它是一个很好的工具。

在您描述的场景中,您想要改变这些项目的正常用法,以便您可以在应用程序启动时预先加载数据。正如你发现的那样,这会导致你现在不得不自己处理的一些问题。处理该问题的一部分是在运行时将DataSource重置为新值。这根本不是不雅或不好的做法。

但是,当你开始谈论假货和因性能问题而导致的缓存时,我想知道你是否真的想要一个数据库。看起来您正在寻找开发一个模型(使用C#对象),您可以根据需要绑定,更新和序列化。虽然我不确定这是否适用于您的设计,但如果这是我的设计(我对您的问题的理解有限),那就是我会做的。即使这样,数据库也不是我项目的重要组成部分。我将构建代表我的表格的C#对象,管理这些项目的模型类以及实例化模型并管理其生命周期的工厂。

如果在某一点上,我不得不序列化/互动,/有一个数据库,我会构建到模型中。

对于我而言,对于优雅而言,更大的问题是如何测试所有这些?如果我在设计时绑定,并且在运行时依靠静态加载,那么我的设计阻止了我执行任何类型的单元或基于类的集成测试。如果我将数据库内容分解成模型,那么我会将数据管理的注意力分成一个类,我可以将一个接口粘贴到这个类中,这样我就可以伪造或模拟存根。

0

我会去使用在Designer.cs一个虚拟对象的想法,但使用条件编译(即#如果DEBUG)

+0

设计师对设计师文件的外观过于严格。它只是删除条件语句。 – JonC 2011-02-28 14:27:30

0

尝试使用单例设计模式。

public sealed class DB 
{ 
    private static readonly DB instance = new DB(); 
    public static DB Instance { get { return instance; } } 

    static DB() { } 
    private DB() 
    { 
     StaticData = new DataSet(); 
    } 

    private static DataSet StaticData; 

    public DataTable GetCategoryTable() 
    { 
     // check if the table has been created 
     if(StaticData.Tables["Category"] == null) 
     { 
      // build table (or retrieve from database) 
      DataTable table = new DataTable(); 
      table.TableName = "Category"; 
      table.Columns.Add("ID", typeof(int)); 
      table.Columns.Add("Name", typeof(string)); 
      table.Columns.Add("Description", typeof(string)); 

      table.Rows.Add(1, "Beverages", "Soft drinks, coffees, teas, beers, and ales"); 
      table.Rows.Add(2, "Condiments", "Sweet and savory sauces, relishes, spreads, and seasonings"); 
      table.Rows.Add(3, "Produce", "Dried fruit and bean curd"); 
      table.Rows.Add(4, "Seafood", "Seaweed and fish"); 
      table.Rows.Add(5, "Meat/Poultry", "Prepared meats"); 
      StaticData.Tables.Add(table.Copy()); 

     } 
     return StaticData.Tables["Category"]; 
    } 

    public DataTable GetStatusTable() 
    { 
     // check if the table has been created 
     if(StaticData.Tables["Status"] == null) 
     { 
      // build table (or retrieve from database) 
      DataTable table = new DataTable(); 
      table.TableName = "Status"; 
      table.Columns.Add("ID", typeof(int)); 
      table.Columns.Add("Name", typeof(string)); 
      table.Columns.Add("Description", typeof(string)); 

      table.Rows.Add(1, "Active", "Active"); 
      table.Rows.Add(2, "Retired", "Retired"); 
      StaticData.Tables.Add(table.Copy()); 

     } 
     return StaticData.Tables["Status"]; 
    } 

} 

使用方法如下:

private void Form1_Load(object sender, EventArgs e) 
    { 
     DB db = DB.Instance; 
     dataGridView1.DataSource = db.GetCategoryTable(); 
     dataGridView2.DataSource = db.GetCategoryTable(); 
     dataGridView3.DataSource = db.GetStatusTable(); 
    } 
+0

只要在这里[单身模式是邪恶](http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx)[骗子](http://misko.hevery。 (2008/08/17/singletons-are-pathological-liars /),并不是说他们没有[良好的用途](http://www.craigsefton.com/programming/the-singleton-pattern-is -not恶/) – Amicable 2012-07-24 09:51:09