3.代码生成器编写

正如上篇文章所说,一般仓储模式,每张表都至少有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生成,目前还没生成表实体,所以找不到这个表,正常。重点在于代码生成!成功完成!

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