如何做一个纯净版的ABP vNext 脚手架

大家好,我是张飞洪,专注.NET开发十来年。感谢您的阅读,我会不定期分享我的学习心得和职场经验,希望我的文章能成为你成长路上的助力。让我们一起精进,共同进步。

今天想和分享的是如何基于一套自定义的模版,用来快速搭建项目的脚手架。

1.各种搭建方式

我们知道ABP 有提供了自己的脚手架搭建方式,有很多种方式,比如像下面这种操作:

1.1命令行

  • 创建控制台项目

    abp new Tota.Microservices -t console -o Tota.Microservices -v 9.3.0

  • 创建Module模板项目(Mysql+无界面)

    abp new Tota.Gdpr -t module --no-ui --dbms mysql -cs "Server=192.168.11.11;Port=3306;Database=JackfeiDb;Uid=root;Pwd=JackfeiDb;" -v 9.3.0

  • 创建WebApi项目

    abp new Tota.File --no-ui -dbms mysql -cs "Server=192.168.11.11;Port=3306;Database=JackfeiDb;Uid=root;Pwd=JackfeiDb;" --separate-auth-server -v 9.3.0

1.2第三方工具

你也可以采用第三方工具,比如AbpHelper来快速搭建,比如下面这种操作:

1.3官网

还有一种,就是你到官网配置并下载

1.4其他

当然,还有其他方式,比如基于老项目进行复制,采用abp studio进行创建等等

2.自定义搭建

以上搭建方式十分方便,但是我想实现的是结合公司自己的规范,希望脚手架能够包含更多自己的最佳实践,比如:

2.1每个类都有完整的注释

复制代码
/// <summary>
/// 数据集应用服务
/// <para>版 权:蓝略数字科技有限公司(https://www.lanlue.cn)</para>
/// <para>作 者:张飞洪</para>
/// </summary>
public class DataSetAppService : ApplicationService, IDataSetAppService

2.2给每个接口增加注释

复制代码
private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration)
{
    context.Services.AddAbpSwaggerGenWithOAuth(
        configuration["AuthServer:Authority"]!,
        new Dictionary<string, string>
        {
                {"DataIntegration", "DataIntegration API"}
        },
        options =>
        {
            options.SwaggerDoc("v1", new OpenApiInfo { Title = "DataIntegration API", Version = "v1" });
            options.DocInclusionPredicate((docName, description) => true);
            options.CustomSchemaIds(type => type.FullName);

            // 引入 XML 注释文件
            var xmlContractFile = $"Tota.DataIntegration.Application.Contracts.xml";
            var xmlHttpApiFile = $"Tota.DataIntegration.HttpApi.xml";
            if (File.Exists(Path.Combine(AppContext.BaseDirectory, xmlContractFile)))
                options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "Tota.DataIntegration.Application.Contracts.xml"));
            if (File.Exists(Path.Combine(AppContext.BaseDirectory, xmlHttpApiFile)))
                options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "Tota.DataIntegration.HttpApi.xml"));

        });
}

2.3 给每个接口一个默认模版,比如像下面这样

复制代码
/// <summary>
/// 创建连接器
/// </summary>
/// <param name="input">创建连接器入参</param>
/// <returns>创建后的连接器</returns>
[HttpPost]
public async Task<ConnectorOutput> CreateAsync([FromBody] CreateConnectorOutput input)
{
    return await _connectorAppService.CreateAsync(input);
}

当然还有很多可能你想要预先内置的规范,这里不一一罗列了,重点来了,这里要怎么实现呢?

关于我们公司的规范和脚手架,统一放在我的知识星球当中:

3.如何实现

3.1 准备模版项目

这个工作还是不可避免的,因为没有人知道你的规范是什么,我这里简单介绍一下我们公司自己的规范,因为规范很多,下面截图只是冰山一角。

比如 DDD 每层的规约:

又比如,DTO 内部的规约:

这些规约是一个公司十分重要的规范,但是你如果只是让新人看文档,可能不是很有感觉,如果这些规范能内置到脚手架里面,那就太好了。

3.2 采用生成工具

  • 把我的模版项目和工具拷贝到你的目录下,比如叫 src目录:

  • 输入配置参数

这个时候,下面会多出一个项目文件

  • 打开并运行项目

新生成项目目录

对比模版项目目录

关于生成小工具,也放在我的知识星球当中: