65.9K
CodeProject 正在变化。 阅读更多。
Home

如何使用 C# 创建酒店房间可用性日历

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2023 年 5 月 4 日

CPOL

13分钟阅读

viewsIcon

16479

downloadIcon

328

一段解决实际问题的代码演练

引言

想象一下,您管理着一家名为 The Quirky Koala Inn 的小型酒店。您有几个房间可以预订。您收到的众多电话咨询之一是某个房间是否可以预订。这些咨询可能需要时间,因此您希望限制电话咨询的数量,除非是预订。因此,您希望在您的网站、应用程序或第三方网站上向潜在客人展示房间可用性。

在本文中,我们将介绍如何为 The Quirky Koala Inn 实现一个 Minimal WebApi。在后续的文章中,我们将扩展功能,并展示如何将 WebApi 连接到 MVC 网站和其他地方。

背景

我花了几年时间开发“Sticky Guest”,这是一个酒店经理可以用来管理预订、客人、账户等的平台。并非所有酒店都需要如此复杂的功能,这里有一种方法可以供任何酒店业主用来构建简单的功能,以改善客人的体验。

要求

我们受托为 The Quirky Koala Inn 解决这个问题。与经理讨论后,我们提出了以下要求:

  1. 创建房间可用性数据库。
  2. 创建一个 WebApi 服务来访问可用性。
  3. 创建一个网站或应用程序来使用 WebApi 向潜在客人展示房间可用性。(第一部分未涵盖)
  4. 创建一个管理门户,以便可以调整房间可用性(第一部分未涵盖)

我已将代码的 ZIP 文件附加到本文。您可以解压并在 Visual Studio 2022 中打开,或者一起编写代码。

第一部分:构建 WebApi 端点

我们将使用 Visual Studio 2022(编辑 - CodeProject 不允许外部链接,因此我已删除此内容。您可以通过搜索引擎搜索“Visual Studio 2022 下载”来找到下载。这将引导您访问 Microsoft 网站。不要将其与“Visual Studio Code”混淆,后者是不同的产品,不适用于本教程!)来创建项目,Microsoft 网站提供了免费和付费版本。

注意 - 确保在安装 Visual Studio 2022 时,选择 ASP.NET 和 Web 开发工作负载。否则,您将缺少我们将使用的选项。

1.1 创建解决方案和 WebApi 项目

完成时,我们将有多个项目位于同一个解决方案中。最初设置好这一点最容易,否则您以后需要重命名项目、命名空间和变量。一个解决方案包含许多相关的项目。

启动 Visual Studio 2022,选择 **文件** > **创建新项目**。

搜索 **空白解决方案**,然后点击 **下一步**。

在 **配置新项目** 下,将 **解决方案名称** 输入为 TheQuirkyKoalaInn,然后点击 **创建**。

将创建一个新的空解决方案。

Visual Studio 2022 没有 **文件** > **创建新解决方案** 的选项,因此我们必须使用此解决方法**

我们现在将创建 WebApi 和支持项目。

右键单击 **解决方案资源管理器** 中的 **解决方案**,然后选择 **添加新项目**。在搜索框中,输入“**ASP.NET Core Empty**”,选择项目模板,然后点击 **下一步**。

在配置中,将项目名称输入为 TheQuirkyKoalaInnWebApi。确保位置位于解决方案的子文件夹中,例如 TheQuirkyKoalaInn\TheQuirkyKoalaInn\TheQuirkyKoalaInnWebApi。随着更多项目的添加,这一点将变得很重要。点击 **下一步**。

在 **其他信息** 下,选择 **框架** “**.NET 7**”,然后点击 **创建**。项目将随后创建。

通过选择 **调试** > **开始调试** 或按 **F5** 来检查项目是否运行。项目编译后,它应该会启动一个浏览器,显示“**Hello World!**”。

注意 - 根据您在 Visual Studio 中的设置,它可能会提示您是否要信任预先构建的 SSL 证书。您应该单击“是”,然后再次单击“是”以在本地安装安全证书。如果您稍后将项目部署到服务器,我们期望服务器具有 SSL 证书,允许通过 HTTPS 而不是 HTTP 进行加密调用。在我们部署网站供公众访问之前,我们不需要关心这个问题。

关闭浏览器,项目将停止运行。

如果打开项目中创建的 Program.cs 文件,我们会发现以下内容:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

行:

app.MapGet("/", () => "Hello World!");

这表明当我们导航到网站的 "/" 时,我们将执行此代码。在此示例中,我们返回一个 string "Hello World!"。我们想添加一个新条目,以便在我们导航到它时返回我们的房间可用性日历。让我们将代码更改为:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.MapGet("/calendar", () =>
{
    return "todo calendar";
});

app.Run();

现在,当我们启动应用程序(**F5**)并导航到 /calendar 时,我们将收到“**todo calendar**”。这就是我们将要编写新代码的地方。

"/""/calendar" 都称为**端点**。每次我们想添加新功能时,都会添加一个新的端点。我们称之为端点,因为它是一个结束客户端的起点。如果我们颠倒过来,从 API 的角度来看,它是代码末尾一个可以访问的点。这里的教训是,命名事物是困难的。

我们现在需要一种方法来存储房间可用性,以便将其展示给客人。我们将使用数据库和模型来完成此操作。

1.2 构建数据库和模型

我们想存储酒店经理设置的房间可用性。然后,当客人访问网站时,可以检索并显示该信息。为此,我们将创建一个简单的数据库。该数据库存储房间及其可用性的表示。我们无法在数据库中保留实际房间,因此我们保留房间的表示,我们称之为模型。模型代表了现实世界中的事物。

我们将为此数据库和模型创建一个新项目。这允许我们以后在其他项目中重复使用它,而无需复制代码。我们希望避免代码的多个副本。

右键单击 **解决方案**,然后选择 **添加 > 新项目**,就像我们之前所做的那样。选择 **类库(.NET 或 .NET Framework)** 选项(不要与类库(.NET Framework)混淆,我们不需要后者)。

点击**下一步**。

对于 **配置新项目**,将项目名称输入为 TheQuirkyKoalaInnDbClassLibrary,并确保子文件夹设置为 TheQuirkyKoalaInn\TheQuirkyKoalaInn\TheQuirkyKoalaInnDbClassLibrary

在此处注意到文件夹结构是值得的,因为主解决方案位于主文件夹中。然后每个项目都在自己的子文件夹中。这很有帮助,因为它允许我们重用项目并保持其简单。如果我们开始使用源代码管理,它会备份我们的更改,除此之外,我们还需要每个项目都在主项目下的自己的子文件夹中。

项目存在的位置的边界并不总是清晰的,因为它取决于上下文。在这种情况下,我们知道我们希望在多个其他项目中都使用数据库项目(TheQuirkyKoalaInnDbClassLibrary),因此它必须位于自己的独立项目中。

点击 **下一步**。在“其他信息”下,选择 **.NET 7**,然后点击 **创建** 以创建项目。

项目将与一个名为 Class1.cs 的默认空类一起创建。我们将创建自己的类,因此右键单击 **解决方案资源管理器** 中的 Class1.cs 文件,然后从菜单中选择 **删除**。

数据传输对象 (DTO)

我们还需要另一个项目来存放我们的数据传输对象 (DTO)。这些对象用于将数据发送到客户端和从客户端接收数据。没有这些对象,我们将不得不把数据库对象发送给客户端。这可能会导致安全问题,向客户端暴露我们可能不想发送的额外信息。它也简化了客户端的代码,因为他们不必担心数据库的内部结构。

右键单击 **解决方案**,然后选择 **添加 > 新项目**,就像我们之前所做的那样。选择 **类库(.NET 或 .NET Framework)** 选项。

对于 **配置新项目**,将项目名称输入为 TheQuirkyKoalaInnDtoClassLibrary,并确保子文件夹设置为 TheQuirkyKoalaInn\TheQuirkyKoalaInn\TheQuirkyKoalaInnDtoClassLibrary

使用与之前相同的设置创建项目,并删除默认的 Class1.cs

您最终应该得到一个如下所示的解决方案:

添加数据库代码

我们现在将为项目创建代码。

我们要模拟一个 Room,所以我们来创建它。右键单击 TheQuirkyKoalaInnDbClassLibrary 项目,然后选择 **添加 > 类**。将类的名称输入为 Room.cs,然后点击 **添加**。

用以下代码替换默认创建的代码:

namespace TheQuirkyKoalaInnDbClassLibrary
{
    public class Room
    {
        public string? Name { get; set; }
        public string? Availability { get; set; }
    }
}

Name 将成为房间的名称。

Availability 将代表一系列字符,用于定义房间在一段时间内的可用性。**"1"** 表示开放日期,而 **"0"** 表示房间已预订。这里有其他表示 Availability 的方法。例如,我们可以使用布尔数组。但是,string 可以更容易地看出发生了什么,并且如果将来我们想将其保存到真实数据库中,也会更容易。这在一定程度上是个人选择。

我们还需要一个类来存储所有房间,因为我们会有不止一个。我们还需要一个类来存储所有这些对象。所以我们将为这两者创建一个新的 Db 类。右键单击 TheQuirkyKoalaInnDbClassLibrary 项目,然后选择 **添加 > 类**。将类的名称输入为 Db.cs,然后点击 **添加**。

用以下代码替换默认创建的代码:

namespace TheQuirkyKoalaInnDbClassLibrary
{
    public class Db
    {
        public List<Room> RoomList { get; set; }
        public DateOnly AvailabilityStartDateData { get; set; }
        public Db()
        {
            AvailabilityStartDateData = DateOnly.FromDateTime(DateTime.Now);

            RoomList = new List<Room>
            {
                new Room()
                {
                    Name = "Room 1 - Double",
                    Availability = "1100111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    111111111111111111111111"
                },
                new Room()
                {
                    Name = "Room 2 - Double",
                    Availability = "1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    111111111111111111111111"
                },

                new Room()
                {
                    Name = "Room 3 - Executive",
                    Availability = "1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    111111111111111111111111"
                },

                new Room()
                {
                    Name = "Room 3 - Single",
                    Availability = "1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    1111111111111111111111111111111111111111111111111111
                                    111111111111111111111111"
                }
            };
        }
    }
}

List<Room> RoomList 为我们提供了一个包含多个房间的列表。我们将为我们的酒店创建三个房间。

DateOnly AvailabilityStartDateData 将告诉我们房间可用性的开始日期。如果设置为 5 月 1 日,那么 Availability 中的第一个字符将代表 5 月 1 日,第二个字符代表 5 月 2 日,依此类推。

构造函数 public Db() 会创建酒店房间并填充一些可用性测试数据。当我们启动应用程序时,这会自动调用,数据将被填充并准备好供我们使用。

添加 Dto 代码

我们现在将创建 Dto 项目(TheQuirkyKoalaInnDtoClassLibrary)的代码。

我们希望能够从数据库房间模型对象创建一个 Dto 对象。默认情况下,一个项目不知道另一个项目。如果我们尝试引用 TheQuirkyKoalaInnDbClassLibrary 项目中的类,它将生成一个错误:

找不到类型或命名空间名称“XYZ”(您是否缺少 using 指令或程序集引用?).

我们需要添加对相关项目的引用来解决这个问题。为此,右键单击 TheQuirkyKoalaInnDtoClassLibrary 项目,然后选择 **添加 > 项目引用**。

将出现“引用管理器”。勾选 TheQuirkyKoalaInnDbClassLibrary 项目,然后点击 **确定**。

TheQuirkyKoalaInnDtoClassLibrary 项目现在将能够访问 TheQuirkyKoalaInnDbClassLibrary 项目中标记为 Public 的任何类。

我们需要一个 RoomDto,所以我们来创建它。右键单击 TheQuirkyKoalaInnDtoClassLibrary 项目,然后选择 **添加 > 类**。将类的名称输入为 RoomDto.cs,然后点击 **添加**。

用以下代码替换默认创建的代码:

using TheQuirkyKoalaInnDbClassLibrary;

namespace TheQuirkyKoalaInnDtoClassLibrary
{
    public class RoomDto
    {
        public string? Name { get; set; }
        public string? Availability { get; set; }
        public RoomDto() { }
        public RoomDto(Room room, DateOnly availabilityStartDate, DateOnly getFromDate)
        {
            if (String.IsNullOrEmpty(room.Availability)) 
                throw new ArgumentNullException(nameof(room.Availability));

            int startIndex = 
                (int)(getFromDate.DayNumber - availabilityStartDate.DayNumber);
            if (startIndex > 365 - 30) startIndex = 365 - 30;
            if (startIndex < 0) startIndex = 0;
            this.Name = room.Name;
            this.Availability = room.Availability.Substring(startIndex, 30);
        }
    }
}

Name 是房间的名称,与数据库中的一样。

Availability 与之前的 string 相同,只是起始日期将取决于酒店客人的需求。例如,我们的数据库可能存储从 5 月 1 日开始的房间可用性,但我们的客人可能想查看 5 月 14 日。我们不想将完整的可用性传输到客户端设备,因此我们将从 5 月 14 日开始传输。

这里的代码很有趣:

public RoomDto(Room room, DateOnly availabilityStartDate, DateOnly getFromDate)

这会从一个 room 对象创建一个 RoomDto 对象。为了实现这一点,我们还需要知道 room.AvailabilityavailabilityStartDate)的开始日期是什么,以及我们想返回的日期范围(getFromDate)。然后我们将返回任意 30 天的房间可用性。

这行代码允许我们引用 TheQuirkyKoalaInnDbClassLibrary 项目。

using TheQuirkyKoalaInnDbClassLibrary;

我们将让客人能够一次检索多个房间。这是我们的一种假设,因为它取决于客户端应用程序的需求。当我们有一个房间、日期和可用性集合时,称之为 Calendar 似乎是合理的。我们将把这个封装到一个 CalendarDto 对象中。

让我们创建一个 CalendarDto。右键单击 TheQuirkyKoalaInnDtoClassLibrary 项目,然后选择 **添加 > 类**。将类的名称输入为 CalendarDto.cs,然后点击 **添加**。

用以下代码替换默认创建的代码:

namespace TheQuirkyKoalaInnDtoClassLibrary
{
    public class CalendarDto
    {
        public List<RoomDto>? RoomList { get; set; }
        public DateOnly AvailabilityStartDateData { get; set; }
    }
}

List<RoomDto>? RoomList 是我们包含可用性的 Room 列表。

DateOnly AvailabilityStartDateData 是日历的开始日期。

现在我们需要将其与 WebApi 连接起来。

添加 WebApi 代码

有了所有这些准备就绪,我们现在可以在 WebApi 项目(TheQuirkyKoalaInnWebApi)中添加代码,以将日历返回给客户端。

TheQuirkyKoalaInnWebApi 项目需要使用其他两个项目中的代码。与之前一样,我们需要添加项目引用。为此,右键单击 TheQuirkyKoalaInnWebApi 项目,选择 **添加 > 项目引用**。然后勾选 TheQuirkyKoalaInnDtoClassLibraryTheQuirkyKoalaInnDbClassLibrary 项目。点击 **确定** 保存。

然后编辑 Program.cs 文件,并将代码替换为:

using TheQuirkyKoalaInnDbClassLibrary;
using TheQuirkyKoalaInnDtoClassLibrary;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<Db>();
var app = builder.Build();

// /calendar/2023-4-28
app.MapGet("/calendar/{date?}", (DateOnly? date, Db db) =>
{
    date = date ?? DateOnly.FromDateTime(DateTime.Now);

    var cal = new CalendarDto
    {
        AvailabilityStartDateData = (DateOnly)date,
        RoomList = new List<RoomDto>()
    };

    foreach (var room in db.RoomList)
    {
        cal.RoomList.Add(new RoomDto
                        (room, db.AvailabilityStartDateData, (DateOnly)date));
    }

    return cal;

});

app.MapGet("/", () =>
{
    return "Hello World";
});

app.Run();

我们正在使用*依赖注入*来创建数据库(Db)类的实例,如下所示:

builder.Services.AddSingleton<Db>();

单例表示我们想要该类的单个实例。否则,我们将创建多个不同的数据库类。我们现在可能可以接受,因为我们只是读取数据。当我们以后想保存数据时,这将导致问题,因为我们会将数据保存到哪一个实例?我们不知道。想象一下把一盘意大利面条掉在地板上,然后用筷子捡起来。

我们在这里为酒店创建一个端点,当我们传入一个 date 时,我们希望获得一个 CalendarDto

app.MapGet("/calendar/{date?}", (DateOnly? date, Db db) =>

参数 Db db 由我们上面定义的依赖注入处理。如果我们创建了更多端点,我们将以类似的方式传递数据库。客户端无需担心,甚至无需了解这一点。

{date?} 中的 **?** 表示该参数是可选的。如果客户端没有传入日期,那么我们将假定他们想要从今天的日期开始的日历,如下所示:

date = date ?? DateOnly.FromDateTime(DateTime.Now);

在这里,我们正在创建一个 CalendarDto 实例,准备返回:

var cal = new CalendarDto 
    { AvailabilityStartDateData = (DateOnly)date, RoomList = new List<RoomDto>() };

处理将在返回给客户端之前完成:

foreach (var room in db.RoomList) 
{ 
    cal.RoomList.Add(new RoomDto(room, db.AvailabilityStartDateData, (DateOnly)date)); 
}

在这里,我们利用了之前创建的 Dto 构造函数方法,该方法将数据库的 Room 转换为 RoomDto

测试 WebApi

如果一切顺利,我们应该能够测试我们所做的。由于我们只在 API 中使用 Get 方法,我们可以在浏览器中测试它。如果我们有更复杂的方法,我们需要使用 Postman 桌面应用程序之类的东西。

按 **F5** 启动应用程序,然后导航到日历 URL,例如 https://:7031/calendar

默认情况下,数据以 JSON 格式显示。这是一种人类可读的格式,更容易看出发生了什么。

{
  "roomList": [
    {
      "name": "Room 1 - Double",
      "availability": "110011111111111111111111111111"
    },
    {
      "name": "Room 2 - Double",
      "availability": "111111111111111111111111111111"
    },
    {
      "name": "Room 3 - Executive",
      "availability": "111111111111111111111111111111"
    },
    {
      "name": "Room 3 - Single",
      "availability": "111111111111111111111111111111"
    }
  ],
  "availabilityStartDateData": "2023-05-04"
}

在这里,我们以客户端应用程序的方式调用 WebApi,并获取房间可用性。这可以用于网站、应用程序或我们可能想要使用的任何其他服务。

在下一部分,我们将设置一个网站来展示它的实际运行情况。

历史

  • 2023 年 5 月 5 日 - 移除了外部网站链接,以符合 CP 文章要求。
  • 2023 年 5 月 4 日 - 初稿完成,第一版编辑完成,提交。
  • 2023 年 5 月 3 日 - 开始撰写初稿。
  • 2023 年 5 月 2 日 - 编码。
© . All rights reserved.