Util应用框架Web Api开发快速入门
本文是使用Util应用框架开发 Web Api 项目快速入门教程.
前面已经详细介绍了环境搭建,如果你还未准备好,请参考前文.
开发流程概述
创建代码生成专用数据库.
Util应用框架需要专门用来生成代码的数据库,该数据库仅用于代码生成.
约定: 代码生成数据库应以 .Generator 结尾.
当然你也可以随意起名,但使用约定名称能更清晰的说明数据库用途.
使用配套代码生成器生成代码.
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开发快速入门的更多相关文章
- Openstack API 开发 快速入门
Openstack 做为流行的开源云计算平台,其最大特性是利用其提供的基础设施API,让我们可以以软件的方式来动态管理IAAS资源.Openstack 提供的api是流行的Rest API. ...
- HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...
- 使用ASP.NET 构建 Web 应用程序快速入门-8小时的免费培训视频
- Scott Hanselman的中文博客[转载] [原文发表地址] Building Web Apps with ASP.NET Jump Start - 8 Hours of FREE Trai ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- SpringBoot开发快速入门
SpringBoot开发快速入门 目录 一.Spring Boot 入门 1.Spring Boot 简介 2.微服务 3.环境准备 1.maven设置: 2.IDEA设置 4.Spring Boot ...
- Asp.Net Web API开发微信后台
如果说用Asp.Net开发微信后台是非主流,那么Asp.Net Web API的微信后台绝对是不走寻常路. 需要说明的是,本人认为Asp.Net Web API在开发很多不同的请求方法的Restful ...
- 循序渐进学.Net Core Web Api开发系列【3】:WebApi开发概览
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 目前我们已 ...
- ASP.NET Core Web API 开发-RESTful API实现
ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...
- Transform组件C#游戏开发快速入门
Transform组件C#游戏开发快速入门大学霸 组件(Component)可以看作是一类属性的总称.而属性是指游戏对象上一切可设置.调节的选项,如图2-8所示.本文选自C#游戏开发快速入门大学霸 ...
随机推荐
- 1 opencv-python图像读写模块
这个分类记录自己学习opencv的随笔文档,方便以后查询和复习.python-opencv环境配置网上教程很多,此处就不做赘述了,该文档记录opencv最基础的图像读写和显示,工具是jupyter n ...
- Linux网络设备命名规则简介
Linux网络设备命名规则简介 几年前, Linux内核为网络接口分配名称采用的是一种简单和直观的方式:一个固定的前缀和一个递增的序号.比如,内核使用eth0名称以标识启动后第一个加载的网络设备,第二 ...
- [GIT]解决:failed to push some refs to ...(过程重现)
本问题有很多种情况,解决方法也很多,本文只针对笔者本人的自身诉求和情况,选择了一种适合我的解决方法.仅供参考. 1 问题描述 johnnyzen@XXDSSS MINGW64 /e/source_co ...
- vue和servlet 前后端分离 (复习)
一.vue复习 1.vue的使用步骤: (1)导入vue.js (2)创建除body以外最大的div标签,给定id值 (3)创建vue对象 new Vue({ el:"#app", ...
- Ubuntu DC + Samba4 AD 实现双域控主机模
文章将讲解如何使用 Ubuntu 16.04 服务器版系统来创建第二台 Samba4 域控制器,并将其加入到已创建好的 Samba AD DC 林环境中,以便为一些关键的 AD DC 服务提供负载均衡 ...
- keycloak~AbstractJsonUserAttributeMapper的作用
AbstractJsonUserAttributeMapper 它是一个抽象类,用来更新条件更新用户属性(user_attribute)的信息,我们在实现自己的mapper时,需要关注3个方法,下面分 ...
- KVM "shutting down, reason=crashed" 问题处理
打开debug日志抓取信息 2022-10-12 07:42:43.698+0000: 63115: debug : processMonitorEOFEvent:4814 : Monitor con ...
- quarkus依赖注入之三:用注解选择注入bean
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<quarkus依赖注入> ...
- 我通过 tensorflow 预测了博客的粉丝数
前言: 由于最近接触了 tensorflow.js,出于试一下的心态,想通过线性回归预测一下博客的粉丝走向和数量,结果翻车了.虽然场景用错地方,但是整个实战方法用在身高体重等方面的预测还是有可行性,所 ...
- SQL-去除最大值与最小值求均值的问题
背景 今天有同事问我一道关于数据库SQL的面试题,我刚开始随便给了一个思路,后来思索发现这个思路有漏洞,于是总结下来,仅供参考. 问题: 薪水表中是员工薪水的基本信息,包括雇员编号,和薪水,查询除去最 ...