千家信息网

如何搭建自己的.NET Core项目模板

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了如何搭建自己的.NET Core项目模板,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言基于dotnet cli创
千家信息网最后更新 2026年11月01日如何搭建自己的.NET Core项目模板

这篇文章主要介绍了如何搭建自己的.NET Core项目模板,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前言

基于dotnet cli创建自己的项目模板,也就是大家常说的脚手架。

dotnet cli项目模板预热

开始正题之前,我们先看一下dotnet cli自带的一些模板。

可以看到种类还是很多的,由于工作大部分时间都是在写WebAPI,所以这里就用WebAPI来写个简单的模板。

下面我们就基于dotnet cli写一个自己的模板。

编写自己的模板

既然是模板,就肯定会有一个样例项目。

下面我们建一个样例项目,大致成这样,大家完全可以按照自己习惯来。

这其实就是一个普通的项目,里面添加了NLog,Swagger,Dapper等组件,各个项目的引用关系是建好的。

该有的公共类,里面也都包含了,好比宇内分享的那个WebHostBuilderJexusExtensions。

下面是这个模板跑起来的效果。

就是一个简单的Swagger页面。

现在样例已经有了,要怎么把这个样例变成一个模板呢?

答案就是template.json!

在样例的根目录创建一个文件夹.template.config,同时在这个文件夹下面创建template.json。

示例如下:

{  "author": "Catcher Wong", //必须  "classifications": [ "Web/WebAPI" ], //必须,这个对应模板的Tags  "name": "TplDemo", //必须,这个对应模板的Templates  "identity": "TplDemoTemplate", //可选,模板的唯一名称  "shortName": "tpl", //必须,这个对应模板的Short Name  "tags": {   "language": "C#" ,   "type":"project"  },  "sourceName": "TplDemo", // 可选,要替换的名字  "preferNameDirectory": true // 可选,添加目录 }

在这里,有几个比较重要的东西,一个是shortName,一个是sourceName。

  • shortName,简写,偷懒必备,好比能写 -h 就绝对不写 --help

  • sourceName,这是个可选的字段,它的值会替换指定的项目名,正常是把项目名赋值在这里。如果不指定,创建的项目就和样例项目保持一致。

在写完template.json之后,还需要安装一下这个模板到我们的cli中。

使用 dotnet new -i进行模板的安装。

下面是安装示例。

dotnet new -i ./content/TplDemo

这里要注意的是,与.template.config文件夹同级的目录,都会被打包进模板中。

在执行安装命令之后,就可以看到我们的模板已经安装好了。

这个时候已经迫不及待的想来试试这个模板了。

先来看看这个模板的帮助信息。

dotnet new tpl -h

因为我们目前还没有设置参数,所以这里显示的是还没有参数。

下面来创建一个项目试试。

从创建一个项目,到运行起来,很简单,效果也是我们预期的。

下面来看看,新建的这个HelloTpl这个项目的目录结构和我们的模板是否一样。

可以看到,除了名字,其他的内容都是一样的。

是不是感觉又可以少复制粘贴好多代码了。

虽说,现在建项目,已经能把一个大的模板完整的copy出来了,但是始终不是很灵活!

可能有小伙伴会问,明明已经很方便了呀,为什么还会说它不灵活呢?

且听我慢慢道来。

如果说这个模板是个大而全的模板,包含了中间件A,中间件B,中间件C等N个中间件!

而在建新项目的时候,已经明确了只用中间件A,那么其他的中间件对我们来说,可能就没有太大的存在意义!

很多时候,不会想让这些多余的文件出现在代码中,有没有办法来控制呢?

答案是肯定的!可以把不需要的文件排除掉就可以了。

文件过滤

模板项目中有一个RequestLogMiddleware,就用它来做例子。

我们只需要做下面几件事就可以了。

第一步,在template.json中添加过滤

加入一个名字为EnableRequestLog的symbol。同时指定源文件

{  "author": "Catcher Wong",  //others...  "symbols":{   //是否启用RequestLog这个Middleware   "EnableRequestLog": {    "type": "parameter", //它是参数    "dataType":"bool", //bool类型的参数    "defaultValue": "false" //默认是不启用   }  },  "sources": [   {     "modifiers": [       {         "condition": "(!EnableRequestLog)", //条件,由EnableRequestLog参数决定         "exclude": [ //排除下面的文件          "src/TplDemo/Middlewares/RequestLogMiddleware.cs",          "src/TplDemo/Middlewares/RequestLogServiceCollectionExtensions.cs"          ]       }     ]   }  ]   }

第二步,在模板的代码中做一下处理

主要是Startup.cs,因为Middleware就是在这里启用的。

  using System;  //other using...  using TplDemo.Core;#if (EnableRequestLog)    using TplDemo.Middlewares;#endif  ///   ///   ///   public class Startup  {    public void Configure(IApplicationBuilder app, IHostingEnvironment env)    {      //other code....#if (EnableRequestLog)      //request Log      app.UseRequestLog();#endif            app.UseMvc(routes =>      {        routes.MapRoute(          name: "default",          template: "{controller=Home}/{action=Index}/{id?}");      });    }  }

这样的话,只要EnableRequestLog是true,那么就可以包含这两段代码了。

下面更新一下已经安装的模板。

这个时候再去看它的帮助信息,已经可以看到我们加的参数了。

下面先建一个默认的(不启用RequestLog)

dotnet new tpl -n NoLog

这个命令等价于

dotnet new tpl -n WithLog -E false

下面是建好之后的目录结构和Startup.cs

可以看到RequestLog相关的东西都已经不见了。

再建一个启用RequestLog的,看看是不是真的起作用了。

dotnet new tpl -n WithLog -E true

可以看到,效果已经出来了。

下面在介绍一个比较有用的特性。动态切换,这个其实和上面介绍的内容相似。

动态切换

直接举个例子来说明吧。

假设我们的模板支持MSSQL, MySQL, PgSQL和SQLite四种数据库操作

在新建一个项目的时候,只需要其中一种,好比说要建一个PgSQL的,肯定就不想看到其他三种。

这里不想看到,有两个地方,一个是nuget包的引用,一个是代码。

上一小节是对某个具体的功能进行了开关的操作,这里有了4个,我们要怎么处理呢?

我们可以用类型是choice的参数来完成这个操作。

修改template.json,加入下面的内容

{ "author": "Catcher Wong", //others "symbols":{  "sqlType": {   "type": "parameter",   "datatype": "choice",   "choices": [    {     "choice": "MsSQL",     "description": "MS SQL Server"    },    {     "choice": "MySQL",     "description": "MySQL"    },    {     "choice": "PgSQL",     "description": "PostgreSQL"    },    {     "choice": "SQLite",     "description": "SQLite"    }   ],   "defaultValue": "MsSQL",   "description": "The type of SQL to use"  },   "MsSQL": {   "type": "computed",   "value": "(sqlType == \"MsSQL\")"  },  "MySQL": {   "type": "computed",   "value": "(sqlType == \"MySQL\")"  },  "PgSQL": {   "type": "computed",   "value": "(sqlType == \"PgSQL\")"  },  "SQLite": {   "type": "computed",   "value": "(sqlType == \"SQLite\")"  } }}

看了上面的JSON内容之后,相信大家也知道个所以然了。有一个名为sqlType的参数,它有几中数据库选择,默认是MsSQL。

还另外定义了几个计算型的参数,它的取值是和sqlType的值息息相关的。

MsSQL,MySQL,PgSQL和SQLite这4个参数也是我们在代码里要用到的!!

修改csproj文件,让它可以根据sqlType来动态引用nuget包,我们加入下面的内容

         

同样的,代码也要做相应的处理

#if (MsSQL)  using System.Data.SqlClient;#elif (MySQL)  using MySql.Data.MySqlClient;#elif (PgSQL)  using Npgsql;#else   using Microsoft.Data.Sqlite;#endif  protected DbConnection GetDbConnection()  {#if (MsSQL)          return new SqlConnection(_connStr);#elif (MySQL)          return new MySqlConnection(_connStr);#elif (PgSQL)           return new NpgsqlConnection(_connStr);#else           return new SqliteConnection(_connStr);#endif         }

修改好之后,同样要去重新安装这个模板,安装好之后,就可以看到sqlType这个参数了。

下面分别创建一个MsSQL和PgSQL的项目,用来对比和验证。

先后执行

dotnet new tpl -n MsSQLTest -s MsSQL dotnet new tpl -n PgSQLTest -s PgSQL

然后打开对应的csproj

可以看到,PgSQL的,添加多了NPgsql这个包。而MsSQL的却没有。

同样的,DapperRepositoryBase也是一样的效果。在创建Connection对象的时候,都根据模板来生成了。

当然这个是在我们自己本地安装的模板,其他人是没有办法使用的。

如果想公开,可以发布到nuget上面去。如果是在公司内部共享,可以搭建一个内部的nuget服务,将模板上传到内部服务器里面去。

感谢你能够认真阅读完这篇文章,希望小编分享的"如何搭建自己的.NET Core项目模板"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

模板 项目 参数 文件 代码 中间件 时候 内容 就是 效果 目录 篇文章 面的 动态 同时 名字 文件夹 是在 处理 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网龙头 网络科技有限互联网 互联网科技集团 互联网与新科技 致聘互联网科技 广州互联网络科技有限公司 互联网科技股有哪些 汉立互联网科技有限公司联系电话 互联网科技实习生岗位职责 和信科技工业互联网 江阴互联网智能科技产品进口 杭州壁岐互联网科技有限公司 苏州铭阳互联网科技有限公司 东莞新华互联网科技学校 洛阳共同富裕互联网科技有限公司 互联网科技圈年度人物 广州梦谷互联网科技有限公司领导 中国新注册互联网科技 互联网科技大佬云集 互联网科技创新方面的资料 深圳市人人互联网科技有限公司 博彦科技互联网金融 互联网科技产业 互联网科技工作委员会毛军 互联网科技金融 互联网金融监管科技 哈尔滨秒房互联网科技有限公司 工业互联网山东科技大学 雨阳互联网卡科技有限公司 互联网科技对化妆品行业
0