2009-07-15 25 views
3

我目前正在寫一個CAD風格的軟件插件。該插件基於從CAD模型讀取的數據和大量表格查找進行計算(假設在計算指南中打印了表格)。我繼承了這個插件,當前的解決方案定義了一個類Constant,它有一堆靜態結構成員和二維數組。然後,這些數組在運行時通過枚舉值進行索引,以查找適當的數據。如何在C#項目中存儲表格常量數據?

我不是太滿意的解決方案,如Constant類的代表是種難以閱讀 - 當檢索數據當然不可見使用的枚舉值時編輯數據(雖然只有曾經發生過手動和很少)。

我寧願不捆綁DB(和發動機)的小插件,但將使用LINQ to選擇其中某些字段匹配等

什麼是您的首選解決方案值喜歡類似的語義,例如對這個問題?

  • 您是否使用了一堆XML文件並在運行時解析它們?
  • 您是否在編譯時使用模板引擎(t4?)從XML文件生成類?
  • 你存儲在資源數據集的XML版本(讀「時間在運行時,LINQ到數據集...)
  • ,你會只保留Constants類,也許一些文檔添加到成員(不讓我開始關於遺留代碼,沒有任何評論......)
+0

(如果您想重新使用我使用的序列化API,它是免費的:protobuf-net) – 2009-07-27 11:00:51

回答

4

我現在正在爲性能關鍵型應用程序做這件事。我這樣做的方式是通過在平面文件中序列化數據(作爲我的發佈過程的一部分),然後(在啓動時)將其反序列化爲類模型,從而允許LINQ到對象查詢。

在大多數情況下,xml是合理的,但首選我使用我自己的二進制串行器 - 主要是爲了速度。

由於常量數據不會改變,通常可以將它緩存在您保持方便並重復使用多次的實例中(而不是每次使用反序列化)。

澄清:要使用的數據存儲在標準數據庫中(它們擅長這種類型的事情,並且存在用於導入/編輯/查詢/等的大量工具)。由於我的發佈過程的一部分,我加載數據到對象模型(使用相同的類)從數據庫中,並對其進行序列化:

// during release 
MyDataModel data = new MyDataModel(); // wraps multiple data lists 
data.Load(); // from database tables, using ORM 
data.Save("data.bin"); // serialization 

然後我船data.bin與應用(當然,實際上它單獨存儲,但這是一個...);;並在運行時:

MyDataModel data = new MyDataModel(); 
data.Load("data.bin"); // deserialization 
data.Freeze(); // make immutable 

請注意,在這種情況下,數據是「冰棍不可變」 - 即爲了保持「恆定」性質(但是讓它在加載期間編輯數據),我有一個級聯的Freeze方法,在項目上設置標誌;一旦設置了該標誌,所有編輯(到項目或列表)都會引發異常。這沒有任何性能影響或運行代碼:因爲您希望將其視爲常量數據,它只會讀取!

+0

重點使用標準數據庫來處理數據。這將使編輯/更改數據輕鬆了許多後來... – 2009-07-27 10:45:54

1

除非性能是一個約束,我會採用XML數據集在資源方法。這是相當明顯的(因此,將來從你那裏拿到代碼的人不會被它的外表所困惑),編輯和訪問都很容易,並且不需要以表格XML的自定義分析器的形式重新發明輪子數據。

+0

關於如何在Visual Studio 2008中將XML數據集編輯爲資源,您有任何提示嗎? – 2009-07-15 07:53:32

+0

你的意思是直觀地將它編輯爲表格?我不認爲它可以做到這一點。 – 2009-07-15 17:23:54

0

您可以生成Constant類。
通過這種方式,您可以將數據存儲在更方便的方法中,例如MDB(MS Access)或MDF(SQL Express)文件。編輯這些文件是用戶友好的。

我建議你有一個額外的項目,生成主項目的Constant類,並將所有需要的數據作爲常量。額外的項目可以是一個控制檯應用程序。在主項目中使用預生成事件來執行此控制檯應用程序,然後生成您的生成的類。

0

我第二次建議使用XML(無論是否爲資源庫),但想詳細解釋一下解析/編輯/處理這種情況的問題。


首先涉及通過在Visual Studio(VS)的表編輯器相關Pavels答案是否的可視化編輯XML問題的短信是可能的:它使用的是2003年VS其實(例如參見「圖6.28 XML文檔:數據視圖'here,看起來如何),在VS 2005中,該功能有所降級(例如參見XML Appearance in Visual Studio 2005 versus Visual Studio 2003),並在VS 2008中最終被刪除(例如參見XML Data Editor missing in Visual Studio 2008),這很不幸,因爲它有其用途,也可能在這裏幫助你。 XML架構設計器的命運相同(可能相關),它至少將在VS 2010中得到替代,但不瞭解新的XML數據視圖。


回到你原來的問題:給你的要求,你可以爲提供您的XML文件的專用XML schema。一旦到位,任何體面的XML編輯器都將能夠至少提供Intellisense(即枚舉值在編輯時可見),並且也會警告您有關錯誤的數據條目。如果以這種方式編輯XML源仍然感覺過於「粗糙」,您可能會通過類似XML Notepad 2007的方式獲得更舒適的「非源」編輯。

但又具有XML模式的最重要的好處是,這允許通過自動化工具的使用,特別是可以產生兩者普通的舊.NET類和/或LINQ啓用數據集通過從中微軟XML Schema Definition Tool (Xsd.exe)。 (對於衆所周知的結構化數據,即由XML模式支持,這實際上比使用基於t4的定製t4解決方案要好得多。)

當然,讓模式擺在首位並在實踐中讓它們正確使用可能需要一些努力,但是這對於任何嚴肅的XML相關的開發都是不錯的選擇。

並在手,你實際上可能已經更好,能夠推斷從現有的類Constant XML架構,看到「/ T」開關Xsd.exe任務。可能最初的結果可能不完整或不完全充分,但是通過一些前期重構和/或手動調整,你應該能夠很快得出一個像樣的模式。因此,您應該能夠像您現在一樣(可能)使用與您的代碼庫非常相似的代碼庫,即您將強制鍵入枚舉等,或者您可以根據需要通過啓用LINQ的數據集切換使用XML數據(實際上,您可以同時執行這兩個操作)。

1

如果部署是一個問題,您可以隨時在程序集中嵌入一個XML文件。這使您可以保持相同的恆定級別,因爲用戶無法使用這些數據。

任何文件都可以作爲嵌入式使用VS資源,只需將文件添加到項目,並選擇:建立行動=>嵌入式從屬性的資源。

然後在啓動時,你可以撥打:

// name is the name of the embedded resource 
Assembly.GetExecutingAssembly().GetManifestResourceStream(name); 

爲了得到一個流嵌入的數據。

這種方法的好處是,你可以保持您的常量數據在任何你想要的格式,這將使得維護更加容易。在啓動時,您可以執行所有索引和組織,以便數據具有適當的API。