3.代码生成器编写

代码 · 浏览次数 : 3

小编点评

**代码生成器** 代码生成器是生成C#代码的工具,可以使用文本模板或运行时模板来生成代码。 **文本模板** 文本模板是一种包含文件在.tt文件中的包含文件。 **运行时模板** 运行时模板是一种将模板中的内容包含到运行时代码中的代码。 **代码生成器的语法** * <#…#>:用于注释。 * <#+……>:用于嵌套使用。 * <#…#>:用于多个方法或语句的合并。 **示例代码** ```ttinclude ProjectDir相当于模板所在的根路径,模板文件里特用的 <#@ include file=\"$(ProjectDir)GeneratingClass.ttinclude\"#> ``` **使用代码生成器** 1. 创建一个.tt文件。 2. 在模板中包含.ttinclude文件。 3. 使用代码生成器生成代码。 4. 将生成的代码保存为.cs文件。 **注意** * 代码生成器仅支持文本模板。 * 代码生成器没有智能提示或格式化。 * 代码生成器不能用于生成复杂类型或继承的代码。

正文

正如上篇文章所说,一般仓储模式,每张表都至少有4个类。仓储接口、实现类,服务接口实现类。假设你有N张表,如果凭借手动新建,那可真是离腱鞘炎不远了……

SO~我在这篇文章主要写一下代码生成器。

其实好早之前就知道这个东西,也见过网上很多开源的代码生成器,如果觉得麻烦,懒得自己做,其实可以跳过这篇文章了。在网上找一个自己配置下就行了,这玩意儿说难不难,说简单也不是很简单,可能会涉及一些偏向底层的接口什么的,当然啦,你如果使用一些工具,插件或者开源的代码生成器,那就不需要担心了,可能稍微配置一下就好了,我没有去研究过那些开源的,所以我就不多说什么了,可以自己去找一下。

我使用的是微软的T4模板。毕竟这是个Net项目嘛,而且相对来说C#代码还是容易看得懂的,只是一些比较冷门,比较偏底层的接口实在是难搞,微软文档太难找了……

在这个项目开始之前我压根不会代码生成,我不想最后写着写着搞得很麻烦,所以熬夜学了几天,可能理论上的细节上的我目前没法给你将的很明白。我在搜罗相关博客的时候发现关于T4模板的都很早了(集中在12年-16年),没怎么细看,因为一眼看过去和官方文档差不多,所以最好的老师还是官方文档

正文部分开始:

先丢一个创建.tt文件的默认内容:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".txt" #>

简单先说一下T4模板里的两种不同模板:一种是文本模板(TextTemplatingFileGenerator),一种是运行时模板(TextTemplatingFilePreprocessor)。

用到的是文本模板,运行时模板我没怎么看,写法也差不多,但文本模板已经够用了,我也害怕太久不更新我自己就懈怠了,忘记了,所以这几天熬夜都到四五点…我哭死……

你在vs新建项的时候搜索模板,就会搜索到对应的文件类型了。他们的文件名扩展为 .tt

还有一个扩展名为 .ttinclude的一种文件。这个你新建一个txt就行,修改后缀名就得了,好像没法直接添加。官方话语太官方,我当时没怎么理解,现在写博客的时候算是温故而知新吧。那我的理解就很简单了,这种类型的文件是作为包含文件在.tt文件中使用的。就相当于你写代码,调用其他类里的方法一样。

写法大概是:

假设我有这么一个文件 text.ttinclude。

在.tt文件中包含此文件:ProjectDir相当于模板所在的根路径,模板文件里特用的(大概是,我也是第一次在这里使用)

<#@ include file="$(ProjectDir)GeneratingClass.ttinclude"#>  

接下来就是T4中的一些语法

 按照顺序来说

  1. <#……#>: 这个可以在里面写c#语法 但不能嵌套使用,例如:foreach并未结束,但是我要在模板添加内容就不得不给个结尾,然后在使用新的<#……#>继续编写

     

  2. <#+……> 这个可以在里面写完整的c#方法,我目前一般都是在.ttinclude文件中使用,封装成方法去使用,T4模板没有智能指令,就是文本文字,所以写在ttinclude中看着比较舒服,当然.tt文件中也可以使用,效果一样的。类似这样,这个回头可以直接找我代码看吧,连个折叠都没有,也没法颜色区分,我是参考了网上的代码改写的,相对来说简单点,没有特别复杂的

  3. <#=……#>这个比较简单了。你在上面两个指令里写的c#语法,里面的变量参数,可以使用这个去获取。例如:

  4. 剩下两个 import 可以理解为using(当然它不止如此),引入命名空间的。include则是在.tt文件中引入.ttinclude文件的。写法大致如下
    <#@ import namespace="System.IO" #>
    <#@ include file="$(ProjectDir)DbHelper.ttinclude"#>

到这里,基础的玩意儿都已经讲差不多了,T4模板写起来语法没什么,就是没有格式化,没有智能提示,甚至没有颜色区分。完全可以当成txt来看待。我是使用了两个插件,所以我截图里面有颜色,不然我真的搞不下去,能看瞎……

回头俺这个要是关注人多了,可以来录视频讲解下。

虽然这篇文章好像啥也没写吧,其实主要是代码部分,他不是.cs文件那种,层次分明的,连个折叠都没有,我有点难搞,so~你们直接来看代码好了,我会上传git,我写的还可以吧hhhh,我尽量按照标准的代码格式去写了,不至于睁眼瞎~找个少的给你们大致看眼代码(截图,因为上传代码块会错位很多,理解起来效果不好,可以去git来下载,顺便点个关注star)

最后的最后!演示下效果:

还是上次建好的项目,现在他是啥也没有:

 然后我启动代码生成功能,得到的效果如下:根据数据库表结构已经全部自动生成完毕

 打开会提示找不到类型,这里的话我打算通过Sqlsugar生成,目前还没生成表实体,所以找不到这个表,正常。重点在于代码生成!成功完成!

 

 

今天能早点睡吗…别再失眠了… 结束,掰掰……

 

与3.代码生成器编写相似的内容:

3.代码生成器编写

正如上篇文章所说,一般仓储模式,每张表都至少有4个类。仓储接口、实现类,服务接口实现类。假设你有N张表,如果凭借手动新建,那可真是离腱鞘炎不远了…… SO~我在这篇文章主要写一下代码生成器。 其实好早之前就知道这个东西,也见过网上很多开源的代码生成器,如果觉得麻烦,懒得自己做,其实可以跳过这篇文章了

如何3分钟,快速开发一个新功能

背景 关于为什么做这个代码生成器,其实主要有两点: 参与的项目中有很多分析报表需要展示给业务部门,公司使用的商用产品,或多或少有些问题,这部分可能是历史选型导致的,这里撇开不不谈;项目里面也有很多CRUD的功能,而这些功能的实现代码基本上差不多,这些功能都去手写,也比较浪费时间而且效率很低,还可能会

Mybatiplus通用3.5.1版本及其以上的代码生成器工具类

Mybatiplus通用3.5.1版本及其以上的代码生成器工具类 package com.gton.util; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotati

C++(Qt)-GIS开发-简易瓦片地图下载器

Qt-GIS开发-简易瓦片地图下载器 目录Qt-GIS开发-简易瓦片地图下载器1、概述2、安装openssl3、实现效果4、主要代码4.1 算法函数4.2 瓦片地图下载url拼接4.3 多线程下载5、源码地址6、参考 更多精彩内容 个人内容分类汇总 GIS开发 1、概述 支持单线

Seal AppManager v0.2 发布:进一步简化应用部署体验

经过近3个月的研发,Seal AppManager v0.2 已正式发布。 Seal AppManager 是一款基于平台工程理念的应用统一部署管理平台,于今年4月首次推出。在上一版本中,我们已经释出**集成 ChatGPT 简化服务模板代码生成、云成本可视化、动态环境管理**等功能,通过降低基础设

模块化打包工具-初识Webpack

打包工具解决的是前端整体的模块化,不只是局限于js的模块化,打包工具需要完成的功能有:1.模块打包:完成多个模块的打包,将多个模块的js文件打包到一个js里面。2.loader转换: 以webpack为例,可以使用loader完成格式的转换,改善兼容性问题。 3.代码拆分:可以拆分不同模块的代码,没...

接口测试基础

定义 基于不同的输入参数,校验接口响应数据与预期数据是否一致。后端开发完成后可以先进行接口测试,提前介入测试,尽早发现问题。 接口测试学习内容 1.接口测试用例设计 2.工具实现接口测试,主要就是利用postman或者其他工具测试 3.代码实现接口测试,也就是接口自动化测试 URL 1.URL:是互

编译器优化记录(死代码消除+“激进的”死代码消除)

编译器优化记录(3)——死代码消除+”激进的“死代码消除 0. 什么是死代码消除 相信大家在写C++的时候,如果你定义了一个变量但是没有对其使用,大部分IDE都会对这个变量进行灰色的染色。又或者说,当你开了一个空的循环,在里面定义并使用了一堆和输出值/返回值没有关系的变量,这个时候IDE也会提示你这

[转帖]Web性能优化工具WebPageTest(三)——本地部署(Windows 7版本)

http://www.zlprogram.com/Show/30/30117.shtml 这次先能够使用PC端的浏览器测试,首先需要下载官方的发布版本“WebPageTest 3.0”。 1. agent:浏览器代理软件 2. mobile:移动端参数相关代码 3. www:网站PHP代码 也可以参

500行代码代码手写docker-将rootfs设置为只读镜像

# (3)500行代码代码手写docker-将rootfs设置为只读镜像 > 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。 本章的源码已经上传到git