.Net 模板引擎,带有对象图输出,而不是字符串
Posted
技术标签:
【中文标题】.Net 模板引擎,带有对象图输出,而不是字符串【英文标题】:.Net templating engine with object graph output, not string 【发布时间】:2010-11-25 21:25:23 【问题描述】:我想知道是否有任何用于创建对象图的模板引擎?有许多创建 html 或其他字符串结果的内容。但我想要一个吐出对象的模板引擎。可以说是预处理器。
我有一个应用程序需要某种预定义的对象图,用于呈现特定的页面小部件。例如,我的页面上有一个工具栏,但每个页面都有不同的工具栏。它可能看起来非常相似。但例如按钮 Add 将指向一个页面上的不同 URL。
示例对象图(部分):
IList<ToolbarItem> toolbar = new List<ToolbarItem>
new ToolbarButton
Text = PageResources.NewText,
Url = Url.Action("Add", "Items"),
Icon = ToolbarIconType.New
,
new ToolbarSeparator(),
new ToolbarDropDown
Text = PageResources.DropDownText,
Icon = ToolbarIconType.Filter,
Items = new List<ToolbarDropDownItem>
new ToolbarDropDownItem
Text = PageResources.FirstItem,
Url = Url.Action("Whatever", "Filter")
,
new ToolbarDropDownItem
Text = PageResources.SecondItem,
Url = Url.Action("BlahBlah", "Filter"),
Icon = ToolbarIconType.Search
,
...
,
...
;
这个静态定义(带有动态资源和动态 URL 助手调用)可能会变得非常冗长和复杂。想想类似于 Word 的类似功能区的工具栏。非常复杂且冗长。
我希望将这些对象生成模板存储在数据库中,并且每个页面都可以读取它们自己的内容,然后模板引擎将生成它并使用特定的资源类型 + 键来放入本地化数据。同样的事情会使用操作的 URL...
在对象反序列化(XML 或 JSON)中进行了类似的操作。但内置(反)序列化技术不支持变量替换或资源链接或类似的。最好的办法是支持资源链接和 lambda 表达式。
总结一下:是否有任何 .net 对象图模板引擎/预处理器可以满足我的需求?
【问题讨论】:
难道你不能让所有这些对象都可以 Xml 序列化,然后使用普通的模板引擎来生成 Xml,然后再将其反序列化为对象吗? @Lasse:当然可以。但是,是否有引擎已经开箱即用了这两个步骤? 我不知道,但反序列化部分是,什么... 2行代码?XmlSerializer serializer = new XmlSerializer(typeof(Toolbar)); var tb = Serializer.Deserialize(...) as Toolbar;
@Lasse:不完全是。这个引擎应该能够使用任何资源源等生成任何类型的对象图。想想它似乎并不那么简单。编写模板不应该更复杂,而是尽可能简化。你不觉得 XML 很麻烦吗? JSON 衍生似乎更方便。至少对我来说。
【参考方案1】:
这是一个非常有趣的问题。
我认为一种选择是生成 XAML,然后使用 XamlReader.Load
(see MSDN) 加载 XAML 描述的对象树(或图形)。请注意,XAML 可用于构造任何符合一些基本要求的 .NET 对象(例如,如果它们应该可用作集合,则具有公共 get/set 属性并实现一些接口)。
此外,XAML 是一个 XML 文档,因此应该可以使用可以生成 XML 文件的标准文本模板引擎来生成 XAML 文档。
【讨论】:
【参考方案2】:JSON 序列化
我决定使用 Json.Net 库主要是因为编写 JSON 字符串非常易于人类阅读,或者我应该说 Web 开发人员可读并且易于维护。它与普通的 javascript JSON 非常相似,但具有额外的语法糖(引用保存、类型保存等)
Json.NET 库是对提供的 JavaScriptSerializer
或 DataContractSerializer
类的一个非常好的升级。
【讨论】:
以上是关于.Net 模板引擎,带有对象图输出,而不是字符串的主要内容,如果未能解决你的问题,请参考以下文章