打造自己的.NET Core项目模板


本文整理自网络,侵删。

前言

每个人都有自己习惯的项目结构,有人的喜欢在项目里面建解决方案文件夹;有的人喜欢传统的三层命名;有的人喜欢单一,简单的项目一个csproj就搞定。。

反正就是萝卜青菜,各有所爱。

可能不同的公司对这些会有特定的要求,也可能会随开发自己的想法去实践。

那么,问题就来了。如果有一个新项目,你会怎么去创建?

可能比较多的方式会是下面三种:

  • 简单粗暴型,打开VS就是右键添加,然后引入一堆包,每个项目添加引用。
  • 脚本型,基于dotnet cli,创建解决方案,创建项目,添加包,添加项目引用。
  • 高大上型,VS项目模板,直接集成到VS上面了。

以前我也是基于dotnet cli写好了sh或ps的脚本,然后用这些脚本来生成新项目。

但是呢,这三种方式,始终都有不尽人意的地方。

因为建好的都是空模板,还要做一堆复杂的操作才可以让项目“正常”的跑起来。比如,这个公共类要抄过来,那个公共类要抄过来。。。这不是明摆着浪费时间嘛。。。

下面介绍一个小办法来帮大家省点时间。

基于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

  /// <summary>
  /// 
  /// </summary>
  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,那么就可以包含这两段代码了。

阅读剩余部分

相关阅读 >>

android Sqlite数据库加密的操作方法

python 操作Sqlite数据库的示例

pycharm sqllite连接使用教程

python3 tkinkter + Sqlite实现登录和注册界面

Sqlite教程(十二):锁和并发控制详解

python实现sql注入检测插件实例代码

android编程之Sqlite数据库操作方法详解

Sqlite快速入门指南

android studio连接Sqlite数据库的登录注册实现

Sqlite教程(十):内存数据库和临时数据库

更多相关阅读请进入《Sqlite》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...