本文是使用Util应用框架开发 Web Api 项目快速入门教程.

前面已经详细介绍了环境搭建,如果你还未准备好,请参考前文.

开发流程概述

  1. 创建代码生成专用数据库.

    Util应用框架需要专门用来生成代码的数据库,该数据库仅用于代码生成.

    约定: 代码生成数据库应以 .Generator 结尾.

    当然你也可以随意起名,但使用约定名称能更清晰的说明数据库用途.

  2. 使用配套代码生成器生成代码.

    Util配套代码生成器连接到代码生成数据库,读取元数据,创建项目基架.

快速入门示例项目概述

  • 项目名称: Demo

  • 代码生成数据库名称: Demo.Generator

创建示例数据库

本文创建快速入门示例项目的代码生成数据库.

共提供三种数据库建库脚本,你只需选择一种即可.

创建 Sql Server 代码生成数据库

如果你使用Sql Server数据库,请按下面步骤创建Sql Server示例数据库和示例表.

创建 Demo.Generator 数据库

打开 SQL Server Management Studio ,新建数据库 Demo.Generator .

点击 确定 按钮,创建数据库.

添加示例表 Student

选中 Demo.Generator 数据库,点击 新建查询 按钮.

复制下面Sql语句,创建 Student 示例表.

Sql建库脚本通常使用 PowerDesigner 等数据建模工具生成.

CREATE TABLE [dbo].[Student](
[StudentId] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](200) NOT NULL,
[Gender] [int] NULL,
[Age] [int] NULL,
[Birthday] [datetime] NULL,
[IdCard] [nvarchar](50) NULL,
[Enabled] [bit] NOT NULL,
[CreationTime] [datetime] NULL,
[CreatorId] [uniqueidentifier] NULL,
[LastModificationTime] [datetime] NULL,
[LastModifierId] [uniqueidentifier] NULL,
[IsDeleted] [bit] NOT NULL,
[Version] [timestamp] NULL,
[ExtraProperties] [nvarchar](max) NULL,
CONSTRAINT [PK_STUDENT] PRIMARY KEY CLUSTERED
(
[StudentId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'学生标识' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'StudentId'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'姓名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'Name'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'性别' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'Gender'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'年龄' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'Age'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'出生日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'Birthday'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'身份证' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'IdCard'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'启用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'Enabled'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'CreationTime'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建人标识' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'CreatorId'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'最后修改时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'LastModificationTime'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'最后修改人标识' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'LastModifierId'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否删除' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'IsDeleted'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'版本号' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'Version'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'扩展' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student', @level2type=N'COLUMN',@level2name=N'ExtraProperties'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'学生' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Student'
GO

点击 执行 按钮, Student 示例表创建完成.

创建 PostgreSql 代码生成数据库

如果你使用 PostgreSql 数据库,请按下面步骤创建 PostgreSql 示例数据库和示例表.

创建 Demo.Generator 数据库

打开 PostgreSql 客户端,新建数据库 Demo.Generator .

create database "Demo.Generator"
with owner admin;

添加示例表 Student

运行下面Sql之前先切换到 Demo.Generator 数据库.

create table "Student"
(
"StudentId" uuid not null
constraint "PK_Student"
primary key,
"Name" varchar(200) not null,
"Gender" integer,
"Age" integer,
"Birthday" timestamp with time zone,
"IdCard" varchar(50),
"Enabled" boolean not null,
"CreationTime" timestamp with time zone,
"CreatorId" uuid,
"LastModificationTime" timestamp with time zone,
"LastModifierId" uuid,
"IsDeleted" boolean not null,
"ExtraProperties" text,
"Version" bytea
); comment on table "Student" is '学生'; comment on column "Student"."StudentId" is '学生标识'; comment on column "Student"."Name" is '姓名'; comment on column "Student"."Gender" is '性别'; comment on column "Student"."Age" is '年龄'; comment on column "Student"."Birthday" is '出生日期'; comment on column "Student"."IdCard" is '身份证'; comment on column "Student"."Enabled" is '启用'; comment on column "Student"."CreationTime" is '创建时间'; comment on column "Student"."CreatorId" is '创建人标识'; comment on column "Student"."LastModificationTime" is '最后修改时间'; comment on column "Student"."LastModifierId" is '最后修改人标识'; comment on column "Student"."IsDeleted" is '是否删除'; comment on column "Student"."ExtraProperties" is '扩展属性'; comment on column "Student"."Version" is '版本号'; alter table "Student"
owner to admin;

创建 MySql 代码生成数据库

如果你使用 MySql 数据库,请按下面步骤创建 MySql 示例数据库和示例表.

创建 Demo.Generator 数据库

打开 MySql 客户端,新建数据库 Demo.Generator .

create database `Demo.Generator`

添加示例表 Student

运行下面Sql之前先切换到 Demo.Generator 数据库.

create table Student
(
StudentId char(36) charset ascii not null comment '学生标识'
primary key,
Name varchar(200) not null comment '姓名',
Gender int null comment '性别',
Age int null comment '年龄',
Birthday datetime(6) null comment '出生日期',
IdCard varchar(50) null comment '身份证',
Enabled tinyint(1) not null comment '启用',
CreationTime datetime(6) null comment '创建时间',
CreatorId char(36) charset ascii null comment '创建人标识',
LastModificationTime datetime(6) null comment '最后修改时间',
LastModifierId char(36) charset ascii null comment '最后修改人标识',
IsDeleted tinyint(1) not null comment '是否删除',
ExtraProperties longtext null comment '扩展属性',
Version longblob null comment '版本号'
)
comment '学生';

Web Api开发入门

准备

下载Util应用框架配套代码生成项目,如果已下载,请拉取最新代码进行更新.

生成项目基架

打开Util代码生成项目解决方案 Util.Generator.sln .

将项目 Util.Generators.Console 设置为启动项目.

Util.Generators.Console是一个控制台程序,只需修改几个简单配置,即可开始生成代码.

打开 appsettings.json 配置文件.

使用 Sql Server 生成代码

本小节使用 Sql Server 代码生成数据库.

appsettings.json 配置文件默认使用 Sql Server 数据库,连接字符串已经配置,如果与你的数据库设置不同,请修改.

按 F5 键启动控制台.

生成完成.

生成位置由 OutputPath 配置项 D:\Output 指定.

打开D盘,进入Output目录,可以看到生成的 Demo 项目.

使用 PostgreSql 生成代码

本小节使用 PostgreSql 代码生成数据库.

修改 appsettings.json 配置文件.

DbType : PgSql , 这个配置项指定使用的代码生成数据库类型.

TargetDbType: PgSql, 这个配置项指定项目使用的数据库类型.

ConnectionString: Server=127.0.0.1;User Id=admin;Password=admin;Database=Demo.Generator ,指定连接字符串

修改 appsettings.json 配置文件后,需要重新生成项目,否则可能不生效.

重新生成 Util.Generators.Console 项目, 按 F5 键启动控制台.

生成完成.

生成位置由 OutputPath 配置项 D:\Output 指定.

打开D盘,进入Output目录,可以看到生成的 Demo 项目.

使用 MySql 生成代码

本小节使用 MySql 代码生成数据库.

修改 appsettings.json 配置文件.

DbType : MySql , 这个配置项指定使用的代码生成数据库类型.

TargetDbType: MySql, 这个配置项指定项目使用的数据库类型.

ConnectionString: Server=127.0.0.1;User Id=root;Password=admin;Database=Demo.Generator;Port=3306;Charset=utf8 ,指定连接字符串

修改 appsettings.json 配置文件后,需要重新生成项目,否则可能不生效.

重新生成 Util.Generators.Console 项目, 按 F5 键启动控制台.

生成完成.

生成位置由 OutputPath 配置项 D:\Output 指定.

打开D盘,进入Output目录,可以看到生成的 Demo 项目.

运行示例项目

打开示例项目解决方案 Demo.sln.

解决方案分层结构基于领域驱动设计(DDD)分层架构.

DDD分层架构包含大量构造块,对于大部分业务模块,手工编写这些构造块是枯燥而低效的,使用代码生成可以简化基础管道代码的编写.

如果你对DDD一无所知,可以把它们当成三层架构使用即可.

代码生成以机械的单表方式生成CRUD操作,如果你的业务较为复杂,在生成后立即修改它们.

你不应该依赖代码生成器,通常只在项目初期创建项目基架,后续变更仅生成代码片断并手工合并到你的项目,而不是完全覆盖.

查看代码生成质量

下面来看看生成的代码质量如何.

打开 Student 实体类.

每个实体,代码生成模板会创建两个文件,其中 .Base 结尾的文件用于放置属性,另一个放置业务方法.

对于简单的实体类,可能没有业务方法,你可以合并成一个文件.

可以看到生成的代码十分整洁,并已从必要的基类继承,还包含了注释和基础验证.

运行Web Api项目

打开 Demo.Api 项目下的 appsettings.Development 配置文件.

如果你的代码生成数据库以 .Generator结尾,会帮你创建默认的开发数据库连接字符串.

对于本示例项目,开发数据库名称默认为 Demo .

如果生成的连接字符串为空值,或需要修改参数,请自行配置连接字符串.

DefaultConnection 是Web Api项目的连接字符串, TestConnection 用于Web Api项目的集成测试.

按 F5 键 启动 Demo.Api 项目.

Util 使用 Entity Framework Core 作为主要的数据访问框架.

Web Api项目已经配置了数据库迁移,不必手工输入命令行,启动时会自动运行命令.

可以看到 Demo.Data.SqlServer 项目已经创建 Migrations 迁移目录.

数据库也已经创建 Demo 数据库.

如果使用其它数据库生成代码,则与相应的数据库保持一致,比如 Demo.Data.MySql .

数据迁移完成,将打开 Swagger 页面.

下面我们使用 Swagger 调用 Web Api 创建一个学生.

找到 POST /api/Student, 点击 Try it out 按钮.

输入下列Json数据, 点击 Execute 按钮.

{
"name": "张三",
"gender": 0,
"age": 18,
"birthday": "2023-10-19T06:53:55.469Z",
"idCard": "123",
"enabled": true
}

Swagger返回操作成功消息.

查询数据库 Student 表,可以看到已经插入成功.

运行其它数据库生成代码的操作类似.

后记

Web Api已经运行起来,但只能通过Swagger操作,下一篇我们将把基于Ng Zorro组件库的Angular UI运行起来.

Util应用框架Web Api开发快速入门的更多相关文章

  1. Openstack API 开发 快速入门

    Openstack 做为流行的开源云计算平台,其最大特性是利用其提供的基础设施API,让我们可以以软件的方式来动态管理IAAS资源.Openstack 提供的api是流行的Rest API.     ...

  2. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID

    HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...

  3. 使用ASP.NET 构建 Web 应用程序快速入门-8小时的免费培训视频

    - Scott Hanselman的中文博客[转载] [原文发表地址] Building Web Apps with ASP.NET Jump Start - 8 Hours of FREE Trai ...

  4. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  5. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  6. SpringBoot开发快速入门

    SpringBoot开发快速入门 目录 一.Spring Boot 入门 1.Spring Boot 简介 2.微服务 3.环境准备 1.maven设置: 2.IDEA设置 4.Spring Boot ...

  7. Asp.Net Web API开发微信后台

    如果说用Asp.Net开发微信后台是非主流,那么Asp.Net Web API的微信后台绝对是不走寻常路. 需要说明的是,本人认为Asp.Net Web API在开发很多不同的请求方法的Restful ...

  8. 循序渐进学.Net Core Web Api开发系列【3】:WebApi开发概览

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 目前我们已 ...

  9. ASP.NET Core Web API 开发-RESTful API实现

    ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...

  10. Transform组件C#游戏开发快速入门

    Transform组件C#游戏开发快速入门大学霸 组件(Component)可以看作是一类属性的总称.而属性是指游戏对象上一切可设置.调节的选项,如图2-8所示.本文选自C#游戏开发快速入门大学霸   ...

随机推荐

  1. PostgreSQL 12 文档: PostgreSQL 服务端程序

    PostgreSQL 服务器应用   这一部分包含PostgreSQL服务器应用和支持工具的参考信息.这些命令只在数据库服务器所在的主机上运行才有用.其他工具程序在PostgreSQL 客户端应用中列 ...

  2. Jmeter压测实战:Jmeter二次开发之自定义函数

    1 前言 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具,具备轻量.高扩展性.分布式等特性.Jmeter已支持实现随机数.计数器.时间戳.大小写转换.属性校验等多种函数,方便使用 ...

  3. Unity UGUI的Mask(遮罩)组件的介绍及使用

    Unity UGUI的Mask(遮罩)组件的介绍及使用 1. 什么是Mask组件? Mask(遮罩)组件是Unity UGUI中的一个重要组件,用于限制子对象的可见区域.通过设置遮罩组件,可以实现一些 ...

  4. 10/28-29_String类_SrtingBuffer类_Interger类_笔记

    API:应用程序编程接口 String功能 public String replace (char oldchar ,char newchar); //符串中某一字符被一新字符替换 public St ...

  5. SVE学习记录- SVE特性以及寄存器

    本文地址:https://www.cnblogs.com/wanger-sjtu/p/SVE_learn_0.html SVE对比NEON有几个新增的地方. 变长的向量 支持Gather-load & ...

  6. Blazor中用浏览器打开一个链接的最好方法

    适用于Blazor Wasm和Blazor SSR 调用下面的js方法 说一下为什么不用window.open,有可能被拦截是小问题,大问题是打开新页面未加载完时,回到原页面,大概率卡死,无法点击任何 ...

  7. VBA与VB的区别

    从语言结构上讲,VBA是VB的一个子集,它们的语法结构是一样的.两者的开发环境也几乎相同.但是,VB是独立的开发工具,它不需要依附于任何其他应用程序,它有自己完全独立的工作环境和编译.链接系统.VBA ...

  8. 《高级程序员 面试攻略 》RocketMQ 如何保证顺序性

    RocketMQ 提供了一种称为顺序消息的机制来确保消息的顺序性.下面是一些关键的方法和概念: 1. 顺序消息:顺序消息是指在发送和消费过程中,消息按照特定的顺序进行处理.RocketMQ 通过将消息 ...

  9. 7、Mybatis之特殊SQL

    7.1 创建接口.映射文件和测试类 ++++++++++++++++++++++++++分割线++++++++++++++++++++++++++ 注意namespace属性值为对应接口的全限定类名 ...

  10. Job System 初探

    作者:i_dovelemon 日期:2023-08-24 主题:Fiber, Atomic Operation, MPMC Queue, Multiple thread, Job system 引言 ...