我目前正在为CAD风格的软件编写插件。该插件根据从CAD模型读取的数据和大量表格查找进行计算(在计算指南中考虑打印的表)。我继承了这个插件,当前的解决方案定义了一个类Constant
,它有一堆静态结构成员和二维数组。然后,这些数组在运行时由枚举值索引,以找到适当的数据。
我对解决方案不太满意,因为Constant
类中的表示很难阅读 - 当编辑时,检索数据时使用的枚举值当然不可见数据(尽管只是手动而且很少发生)。
我不想将数据库(和引擎)与一个小插件捆绑在一起,但是想要类似的语义,例如使用LINQ选择某些字段匹配的值等。
这个问题的首选解决方案是什么?
Constants
类,也许会给成员添加一些文档(不要让我开始关于遗留代码而不做任何评论......)答案 0 :(得分:4)
我正在为性能关键型应用程序做这件事。我这样做的方法是将数据序列化为平面文件(作为我的发布过程的一部分),然后(在启动时)将其反序列化为类模型,允许LINQ-to-Objects查询。
在大多数情况下,xml是合理的,但是我喜欢使用自己的二进制序列化程序 - 主要是为了速度。
由于常量数据没有改变,通常可以将它缓存在一个你保持方便并重复使用多次的实例中(而不是每次使用时反序列化)。
澄清:要使用的数据存储在标准数据库中(他们擅长这种类型的东西,并且存在许多用于导入/编辑/查询/等的工具)。作为发布过程的一部分,我将数据加载到数据库中的对象模型(使用相同的类),并将其序列化:
// during release
MyDataModel data = new MyDataModel(); // wraps multiple data lists
data.Load(); // from database tables, using ORM
data.Save("data.bin"); // serialization
然后我用app发送data.bin(好吧,实际上它是单独存储的,但这是一个...);并在运行时:
MyDataModel data = new MyDataModel();
data.Load("data.bin"); // deserialization
data.Freeze(); // make immutable
请注意,在这种情况下,数据是“popsicle immutable” - 即为了保持“常量”性质(但在加载期间让它编辑数据),我有一个级联Freeze
方法设置旗帜上的物品;设置此标志后,所有编辑(对项目或列表)都会抛出异常。这没有性能影响或运行代码:因为您希望将其视为常量数据,它只会读取!
答案 1 :(得分:1)
除非性能是一种约束,否则我将采用XML-dataset-in-resources方法。这是相当明显的(所以无论谁将来会从你那里获取代码都不会被它的外观所迷惑),编辑和访问都很容易,并且不需要以表格XML的自定义解析器的形式重新发明轮子数据
答案 2 :(得分:1)
如果需要考虑部署,则始终可以在程序集中嵌入XML文件。这允许您具有相同级别的恒定性,因为用户将无法使用数据。
任何文件都可以使用VS作为资源嵌入,只需将文件添加到项目中并选择:Build Action =>来自属性的嵌入式资源。
然后在启动时你可以打电话:
// name is the name of the embedded resource
Assembly.GetExecutingAssembly().GetManifestResourceStream(name);
获取嵌入数据的流。
这种方法的优点是您可以以您想要的任何格式保存您的常量数据,这将使维护更容易。在启动时,您可以执行所有索引和组织,以便数据具有适当的API。
答案 3 :(得分:0)
您可以生成Constant
课程
这样,您可以使用更方便的方法存储数据,例如MDB(MS Access)或MDF(SQL Express)文件。编辑这些文件是用户友好的。
我建议您有一个额外的项目来生成主项目的Constant
类,其中包含所有需要的数据作为常量。额外项目可以是控制台应用程序。在主项目中使用预构建事件来执行此控制台应用程序,然后生成您生成的类。
答案 4 :(得分:0)
我提出了使用XML的建议(无论是资源库还是非资源库),但是想详细说明解析/编辑/处理这种情况的问题。
首先,关于与Pavels相关的问题的简短说明回答是否可以通过Visual Studio(VS)中的表编辑器进行可视化编辑XML:实际上它曾经在VS 2003中(参见例如图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类和/通过微软XML Schema Definition Tool (Xsd.exe)从中获取启用LINQ的数据集。 (对于众所周知的结构化数据,即由XML模式支持,这比使用繁琐的基于自定义t4的解决方案更可取。)
当然,首先获取模式并在实践中正确使用模式可能需要一些努力,但这些可以为任何严肃的XML相关开发付出大量时间,imho。
对于手头的任务,您实际上可能已经更好了,并且能够推断现有类Constant
中的XML架构,请参阅{/ t'开关{ {3}}。可能初始结果可能不完整或不完全足够,但通过一些预先重构和/或手动调整,你应该能够很快得出一个合适的模式。
因此,您应该能够像现在一样(大概)使用与您的代码库非常相似的代码库,即您将拥有强类型枚举等,或者您可以通过启用LINQ的数据集切换使用XML数据如你所愿(实际上你可以同时做两件事)。