Util應用框架快速入門(2) - 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運行起來.

浙公網安備 33010602011771號