第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Razor Engine,實(shí)現(xiàn)代碼生成器的又一件利器

標(biāo)簽:
架構(gòu)

 

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

   

   2: {

   

   3: }

   

   4:

   

   5: public class Bar

   

   6: {

   

   7: }

   

   8:

   

   9: public class Baz

   

  10: {

   

  11: }

如下所示的是Generator.tt的内容,它直接执行一个类型为DemoGenerator的生成器。

   1: <#@ template hostspecific="true" language="C#" #>

   

   2: <#@ assembly name="$(TargetDir)Artech.CodeGeneration.dll" #>

   

   3: <#@ import namespace="Artech.CodeGeneration" #>

   

   4: <#@ output extension=".empty" #>

   

   5: <#this.RunCodeGenerator(this.Host, new DemoGenerator());#>

作为代码生成器的DemoGenerator定义如下,它重写了CreateTemplates方法并返回一个包含三个RazorTemplate<TModel>的字典,该字典的Key表示生成的文件名。

   1: public class DemoGenerator: Generator

   

   2: {

   

   3:     protected override IDictionary<string, Template> CreateTemplates()

   

   4:     {

   

   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"));

   

   9:         return templates;

   

  10:     }

   

  11: }

构建RazorTemplate<TModel>需要传入两个参数,第一个参数是用于定义Razor模版的文件路径(可以是绝对路径,也可以是相对于.tt文件的相对路径),另一个是作为Model的对象(相当于ASP.NET强类型View的Model)。通过上面的代码可以看出,三个RazorTemplate<TModel>均使用同一个Model类型为字符串的模版文件template.razor,该模版内容定义如下。可以看出作为Model的字符串在模版中作为了生成类型的名称。

   1: public class @Model

   

   2: {

   

   3: }

我假设你已经了解了《一个简易版的T4代码生成"框架"》这篇文章的内容,所以我们只需要简单介绍RazorTemplate<TModel>的定义就可以了。首选RazorTemplate<TModel>是一个具有如下定义的RazorTemplate类型的子类。RazorTemplate的只读属性TemplateFileName 表示Razor模版的路径,用于读取模版文本内容的虚方法GetTemplateText直接读取指定模版文件的内容。在重写的TransformText方法中,我们调用Razor的静态方法Parse对模版内容进行解析并生成代码文本。

   1: public class RazorTemplate : Template

   

   2: {

   

   3:     public string TemplateFileName { get; private set; }

   

   4:     public RazorTemplate(string templateFileName)

   

   5:     {

   

   6:         this.TemplateFileName = templateFileName;

   

   7:     }

   

   8:     protected virtual string GetTemplateText()

   

   9:     {

   

  10:         string path = this.TemplateFileName;

   

  11:         if (!Path.IsPathRooted(path))

   

  12:         {

   

  13:             path = Path.Combine(Path.GetDirectoryName(TransformContext.Current.Host.TemplateFile), path);

   

  14:         }

   

  15:         return File.ReadAllText(path);

   

  16:     }

   

  17:

   

  18:     public override string TransformText()

   

  19:     {

   

  20:         return Razor.Parse(this.GetTemplateText());

   

  21:     }

   

  22: }

继承自RazorTemplate的泛型RazorTemplate<TModel>定义如下。它具有一个表示Model的只读属性,该属性在构造函数中被初始化。在重写的TransformText方法中,我们调用Razor泛型的静态方法Parse<TModel>解析模版文本并传入Model对象。

   1: public class RazorTemplate<TModel> : RazorTemplate

   

   2: {

   

   3:     public TModel Model { get; private set; }

   

   4:     public RazorTemplate(string templateFileName, TModel model)

   

   5:         : base(templateFileName)

   

   6:     {

   

   7:         this.Model = model;

   

   8:     }

   

   9:

   

  10:     public override string TransformText()

   

  11:     {

   

  12:         return Razor.Parse<TModel>(this.GetTemplateText(), this.Model);

   

  13:     }

   

  14: }

 

相关阅读:    
与VS集成的若干种代码生成解决方案[博文汇总(共8篇)]    
通过CodeDOM定义生成代码的结构    
通过Visual Studio的Custom Tool定义代码生成器    
不同于CodeDOM的代码生成机制——T4    
通过T4模板实现单文件的代码生成    
通过T4模板实现多文件的代码生成    
解决T4模板的程序集引用的五种方案    
编写T4模板进行代码生成无法避免的两个话题:"Assembly Locking"&"Debug"    
通过自定义BuildProvider为ASP.NET提供代码生成

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消