ch01 简介
Introduciong Apps and Services with .NET
本章的主要内容是对开发环境进行配置. 并使用 VS2022
以及 VSCode
. 然后介绍 C#
和 .NET
的更新. 最后介绍一下如何获得帮助.
GitHub 仓库地址: https://github.com/markjprice/apps-services-net7/
可以将 GitHub 域名中的
.com
修改为.dev
可以进入在线VSCode
界面.仓库中有很多附加的文件, 除了代码, 还有数据库脚本等.
按照作者的说法, 可以将在线的
VSCode
与本地的VSCode
一起使用, 可以更容易对比代码, 更容易复制代码.
全书, 作者会用现代 .NET (modern .NET) 来引用 .NET 7, 包括 .NET Core 之后的 .NET 5, .NET Core 等. 使用遗留的 .NET (legacy .NET) 来表示 .NET Fx, Mono, Xamarin, 以及 .NET Standard.
本章包括:
- 本书内容的介绍
- 设置开发环境
- 使用分析器来更好的编写代码
- C# 与 .NET 有哪些更新
- 好好利用本书的 GitHub 仓库
- 去哪里寻求帮助
本书内容简介
本书适合两类人群
- 读完作者第一本书 C# 11 与 .NET 7 的, 并希望进一步学习的.
- 具有基本的知识, 希望在了解实际开发技能的.
一本陪伴你学习之旅的书
然后作者简要介绍了其两本作品, 并对内容进行了简要介绍.
你会学到什么
除了第一章, 本书包含:
- 存储与数据管理. 介绍 SQL Server 和 Azure Cosmos DB, 在本地和云端, 存储和管理数据. 第2章以后会, 会介绍 SQLServer 与实体模型.
- 类库. 日期, 时间, 国际化; 数据的加密, 散列与签名; 使用鉴权与授权来保护 app; 使用线程与任务来提升性能, 并进行性能监视; 使用第三方库来处理图片, 数据验证等. 这部分可以看成 cookbook.
- 服务技术. 使用 ASP.NET Core Web API Minimal API, OData, GraphQL, gRPC, SignalR, 以及 Azure Function
- 用户接口技术. 使用 ASP.NET Core, Blazor, WebAssembly, 以及 .NET MAUI 来构建用户界面.
这里用户接口翻译为用户界面比较好.
我的哲学 (略)
修正我的错误 (略)
项目命名以及端口号的约定
如果你完成了本书的所有任务, 会得到一个案例集, 中多数为 website 和 service 的项目. 这些项目需要在 localhost
上使用端口号.
对于大型, 复杂的解决方案, 在所有代码间导航很困难. 所以命名就很重要. 一个比较好的方案是使用特性的命名空间.
作者学微软在 20 世纪 90 年代, 创建数据库 Northwind
的做法, 创建一个虚拟公司, 并使用 Northwind
作为项目的统一前缀.
组织代码结构的方法很多, 例如可以使用文件夹名字作为层级名.
在项目与工作空间中需要一个统一的命名约定. 一个通用的方法是使用项目类型名, 例如 class library, console app, website 等.
名字 | 描述 |
---|---|
Northwind.Common | 一个类库, 用于描述公共类型. 例如接口, 枚举, 类, record , 以及结构等. 它会用于多个项目. |
Northwind.Common.EntityModels | 通用类库项目. 放置 EFCore 实体模型. 实体模型常常会同时使用在服务与客户端. 因此最好将其与特定数据库 provider 依赖分离开. |
Northwind.Common.DataContext | 类库项目, 用于描述 EFCore 数据库上下文的类库, 该类库会依赖某个特性的数据库 provider . |
Northwind.Mvc | 一个 ASP.NET Core 项目, 它是一个使用 MVC 模式的网站. 它非常容易进行单元测试. |
Northwind.WebApi.Service | 一个 ASP.NET Core 项目, 它是一个 Api 服务. 一般会与网站进行集成, 因为网站可以使用 JS 或 Blazor 与服务进行交互. |
Northwind.WebApi.Client.Console | 访问 web 服务的客户端, 名字的最后一部分表示它是一个控制台程序. |
Northwind.gRPC.Service | 一个 ASP.NET Core 项目, 提供 gRPC 服务. |
Northwind.gRPC.Client.Mvc | 访问 gRPC 服务的客户端. 其命名最后一部分表示它是一个 MVC 项目. |
Northwind.BlazorWasm.Client | ASP.NET Core Blazor WebAssembly 客户端项目. |
Northwind.BlazorWasm.Server | ASP.NET Core Blazor WebAssembly 服务端项目. |
Northwind.BlazorWasm.Shared | 用于 Blazor 项目客户端与服务端的公共类库. |
为了确保可以将所有应用都能正常的运行起来, 我们不能使用重名的端口号. 我采用下面的约定:
https://localhost:5[章节号]1/
http://localhost:5[章节号]2/
例如, 第15章 使用 ASP.NET Core 来构建用户界面 中的 使用加密连接连接到网站 的项目使用: https://localhost:5151/
将警告视为错误
警告是潜在的问题, 忽略其实不好 (作者牛逼), 可以修改配置文件将正视警告内容:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
作者在大部分项目中都这么配置了, 将警告视为错误. 而 gRPC 项目是个例外. 因为在 .NET7 中, 如果类型仅包含小写, 编译器也会警告.
例如, 定义 person 类如下
public class person {
}
编译器就会发出警告.
引入该编译器警告, 为了在 C# 中避免关键字与类型冲突, 因为 C# 中的关键字必须是小写的.
不幸的是, 通过 .proto
文件生成 C# 代码的 google 工具, 在生成类名别名时只能生成小写字符, 如下:
#region Designer generated code
using pb = global::Google.Protobuf;
若将警告视为错误, 编译时就会报错:
除了 gRPC 类型的项目之外, 将警告视为错误是一个很好的习惯.
App 与 服务技术
微软将构建 APP 和 服务的平台称为 应用程序模型 或 工作负载.
使用 ASP.NET Core 构建网站与 app
网站由静态页面与动态页面构成. 静态页面使用文件系统存储写好的页面; 动态页面使用服务端技术, 例如 ASP.NET Core 来动态的生成. 浏览器使用 URI 来请求服务器上的页面, 使用 PUT, POST, 和 DELETE 来操作存储在服务器上的数据.
大多数网站, 浏览器只是一个数据的展示层. 主要的逻辑都在服务器上. 而客户端的 JS 会处理部分数据, 例如实现旋转木马的特效, 或对数据进行校验等.
ASP.NET Core 提供了很多技术, 来构建网站:
- ASP.NET Core Razor Pages 可以动态的生成 HTML 页面.
- ASP.NET Core MVC 它是 MVC 设计模式的实现, 用来创建复杂的网站, 第 15 章会介绍到它.
- Razor 类库 提供一种在 ASP.NET Core 项目中, 可复用的功能组件, 包括用户界面组件.
- Blazor 一种可以在页面中嵌入 C# 和 .NET 的技术, 它可以替代页面中的 JS, 例如 Vue, Angular, React 等功能. Blazor WebAssembly 运行在浏览器端, 就像 JavaScript 一样; Blazor Server 运行来服务器端, 用来动态更新 Web 页面. 分别在第 16 章和第 17 章介绍它.
Blazor 不仅仅用来创建网站, 还可以用来创建混合 App 开发, 包括移动端, 桌面端等.
构建 web 与其他服务
没有正式的定义, 但服务根据其复杂程度可以分为:
- 服务(Service) 将所有客户端需要的所有功能集成到单个服务中.
- 微服务(Microservice) 多个服务, 其中每一个服务关注一个小的功能集合.
- 纳米服务(Nanoservice) 单个函数作为服务进行提供. 与 24/7/356 提供的服务不同, 纳米服务在调用之前都是非激活状态的, 这样可以减少资源的消耗.