Razor Engine,实现代码生成器的又一件利器
Razor Engine,之前仅仅是ASP.NET MVC的一种View引擎,目前已经完全成为一种可以独立使用的模版引擎,并且已经成为了CodePlex上一个开源的项目(http://razorengine.codeplex.com/)。对于使用过ASP.NET MVC Razor视图引擎的朋友们一定已经领略过它的灵活性和易用性,在这篇文章中我们将利用它来实现一个代码生成器使我们可以以Razor的语法来定义代码模版。[源代码从这里下载]
在《一个简易版的T4代码生成"框架"》这篇文章中,我创建了一个能够生成多个文件的代码生成器,其核心是两个基本的类型:Template类生成代码文件的内容,Generator执行Template。现在我将通过自定义一个基于Razor Engine的Template,让它读取以Razor语法编写的模版文件并生成相应的代码。
不过在具体介绍实现原理之前,还是先来看看它能够达到的效果。如右图所示,我们还是通过一个.tt文件(Generator.tt)来生成相应的代码文件,具体生成的代码文件就是依赖于该.tt文件的三个.cs 文件:Foo.cs、Bar.cs和Baz.cs。简单起见,我们仅仅在这三个文件中生成了一个与文件同名的空Class,它们的定义如下。
1: public class Foo
作为代码生成器的DemoGenerator定义如下,它重写了CreateTemplates方法并返回一个包含三个RazorTemplate TModel 的字典,该字典的Key表示生成的文件名。
5: Dictionary string, Template templates = new Dictionary string, Template
6: templates.Add("Foo.cs", new RazorTemplate string ("template.razor", "Foo"));
7: templates.Add("Bar.cs", new RazorTemplate string ("template.razor", "Bar"));
8: templates.Add("Baz.cs", new RazorTemplate string ("template.razor", "Baz"));
构建RazorTemplate TModel 需要传入两个参数,第一个参数是用于定义Razor模版的文件路径(可以是绝对路径,也可以是相对于.tt文件的相对路径),另一个是作为Model的对象(相当于ASP.NET强类型View的Model)。通过上面的代码可以看出,三个RazorTemplate TModel 均使用同一个Model类型为字符串的模版文件template.razor,该模版内容定义如下。可以看出作为Model的字符串在模版中作为了生成类型的名称。
我假设你已经了解了《一个简易版的T4代码生成"框架"》这篇文章的内容,所以我们只需要简单介绍RazorTemplate TModel 的定义就可以了。首选RazorTemplate TModel 是一个具有如下定义的RazorTemplate类型的子类。RazorTemplate的只读属性TemplateFileName 表示Razor模版的路径,用于读取模版文本内容的虚方法GetTemplateText直接读取指定模版文件的内容。在重写的TransformText方法中,我们调用Razor的静态方法Parse对模版内容进行解析并生成代码文本。
13: path = Path.Combine(Path.GetDirectoryName(TransformContext.Current.Host.TemplateFile), path);
继承自RazorTemplate的泛型RazorTemplate TModel 定义如下。它具有一个表示Model的只读属性,该属性在构造函数中被初始化。在重写的TransformText方法中,我们调用Razor泛型的静态方法Parse TModel 解析模版文本并传入Model对象。
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 原文链接
基于.NET平台常用的框架整理 自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就继续补充这篇日志,日积月累,就能形成一个自己的组件经验库。
抛弃NVelocity,来玩玩Razor 原文:抛弃NVelocity,来玩玩Razor 对于内容型,不易变动的东西我们都希望给它来个静态化,还有种情况就是比如新浪云不支持.net,为了能跑起我们的网站, 只能放些静态页面上面,外加jsonp来实现交互,我们知道.net中有很多模板引擎,但都不是原装的,所以基本都没有代码提示, 用起来比较不爽,自razor出来后,私活中也抛弃了原先使用的NVelocity,而采用原装的razor。
相关文章
- OC中使用UI自己定义控件实现计算器的设计(版本号1简单的加减乘除,连加,连减,连除,连乘)
- 8 -- 深入使用Spring -- 3...1 Resource实现类InputStreamResource、ByteArrayResource
- Google Earth Engine:在GEE中实现列表的RMSE、MAE、MSE的评估和计算
- Google Earth Engine(GEE)——多个感兴趣geometry polygon研究区计算ndvi均值的实现过程(计算笑脸的ndvi)
- Google Earth Engine(GEE)——reduceRegion实现感兴趣区域ndvi均值的统计
- Google Earth Engine(GEE)——面板和布局2(在线实现一个点NDVI时序轨迹图
- Google Earth Engine 实现 LandTrendr 光谱-时间分割算法的指南( 示例脚本)
- Google Earth Engine(GEE)——实现一个可视化的监测功能(inspector)一个label就行了
- Redis 如何实现库存扣减操作?如何防止商品被超卖?
- Linux系统位运算函数以及相应CPU ISA实现收录
- Vue - PC 端列表下拉页面触底加载分页数据,监听浏览器屏幕触底事件,类似uni-app微信小程序的onReachBottom()页面触底生命周期函数(监听屏幕触底事件,实现懒加载效果)
- PHP实现非法词汇过滤(算法分析)
- 基于Java+MySQL实现(Web)研究生导师双选系统【100010344】
- Stage 模型下实现 FormExtension 卡片的创建与使用流程分析
- ORM(Object-Relational Mapping 对象关系映射)如何实现(转)
- Java数据存储机制的实现
- Android框架Volley使用:Get请求实现
- 实现基于组织机构的数据集权限系统的设计思路讲解
- 实现mysql的读写分离(mysql-proxy)____2
- 如何实现mysql的远程连接