例如,假设我正在编写一个允许用户设计自己的名片的应用程序,允许他们将可视对象添加到他们当前正在设计的“模板”中,这些对象中的每一个都绑定到各个位用户数据。
例如。他们拖动一个“地址框”,自动输入用户的地址,然后是“名称文字”,再次自动使用用户定义的名称。
原因是客户可以创建15个模板,所有模板都有自己的“外观”,但是如果他们想要更改地址,他们只需要在一个地方修改它。
所有这些可视对象和模板本身都是用XAML编写的。我需要将这些用户创建的模板存储到数据库中,以便他们可以检索它们并在以后编辑它们。我看到它的方式,我有两个选择:
将整个模板作为XAML存储在名为“templates”的数据库表中,并附带ID和OwnerID。
为抽象类型的“可视对象”创建一个表。为每个具体类型的可视对象(即“AddressBox”)创建一个表,该表将从抽象类型继承并具有每个用户可配置属性(字体大小,x / y坐标等)的字段。最后,创建一个名为template的表,该表包含一组可视对象。
应该注意的是,我一直在使用实体框架来设计这个,所以如果我在那里抛出一些EF关键字,请道歉!
就个人而言,目前XAML存储可能足以满足我们的要求,但是我所看到的一切似乎都表明这是一种将数据存储在数据库中的非常糟糕的方式。跳到35分钟:http://youtu.be/uFLRc6y_O3s这不是他建议不要做的事情吗?
使用XAML存储我获得了属性值继承,这可能会使事情稍微容易一些,尽管我不确定用户是否会理解值如何“流”到链中。显然XAML也允许我存储我喜欢的任何属性值;我不必先将它添加到数据库中。
缺点是,如果全部是XAML,我认为管理数据可能要困难得多;最坏的情况可能需要检索每一块XAML,解析所有这些,找到我需要更改/查看的值,重新解析,保存更新后的XAML“blob”。这显然会导致更大的读/写操作。
答案 0 :(得分:5)
我会直接存储XAML。原因是您从存储抽象布局中获得的唯一好处是,您可以替换UI框架,并保护自己免受XAML中潜在的重大变化。 但是,由于微软推出的一项重大变革会破坏所有控制权,因此您可能会利用一些升级可能性。
对我来说,选项2肯定是更好的版本,但我倾向于是“YAGNI” - 嘿。所以在你需要的时候开发东西,如果你在WPF上就去做吧。
HTH, 马丁
答案 1 :(得分:4)
我投票支持选项2,但我想知道,如果你需要为每个具体对象分别使用表,而不是为每个“用户可配置属性”设置一个字段,你可以将所有用户可配置属性放入链接到conrete-object表的另一个表就像。
<强> ConcreteObjectTable 强>
ObjectID | ObjectName | ObjectTemplate
<强> ConcreteObjectPropertyTable 强>
PropertyID | ObjectID | PropertyName |的PropertyValue
这样,您只需要2-3个表来担心配置选项
答案 2 :(得分:2)
我也投票支持选项2。通过以这种方式存储它,您可以非常灵活地使用数据。
缺点是,选项2会强制您编写某种解析器,将数据解析为XAML代码。但是当你想要2个相同数据的GUI(例如HTML)时,你唯一需要做的就是编写一个HTML解析器,你就可以了。您保存到数据库的数据也会减少。
总结(对于选项2):
<强>赞成强>
<强>缺点强>