练习 - 注册和使用服务

已完成

ASP.NET Core 应用通常需要跨多个组件访问相同的服务。 ASP.NET Core 使用内置依赖项注入容器来管理应用使用的服务。

你的团队负责人委托你为公司创建一个基本网站。 网站应在主页上显示欢迎消息。 你决定创建一个服务来生成欢迎消息。 然后,你将向服务容器注册该服务,以便可以将其注入到需要它的组件中。

创建 ASP.NET Core 应用

需要一个 ASP.NET Core 应用来扮演团队应用的角色。 让我们使用 Visual Studio Code 中的 C# 开发工具包扩展创建一个新的 ASP.NET Core 应用。

  1. 启动 Visual Studio Code。

  2. 按 Ctrl+Shift+P 打开命令面板

  3. 搜索并选择 .NET: 新建项目...

  4. 搜索并选择“ASP.NET Core 空”

    命令面板的屏幕截图,其中选择了“ASP.NET Core 空”。

  5. 选择或创建新项目的文件夹。

  6. 将新应用命名为“MyWebApp”

  7. 选择“创建项目”以创建项目

  8. 当新项目打开时,展开 Solution Explorer 窗格以查看项目文件。

    Visual Studio Code 中“解决方案资源管理器”窗格的屏幕截图。

运行应用

测试应用以确保它运行。

  1. 在 Visual Studio Code 中,按 F5 生成并运行应用。

    1. 出现提示时,选择“C#”作为调试程序。
    2. 出现提示时,选择“C#:MyWebApp [默认配置]”作为要使用的启动配置。

    此命令启动应用并将其托管在本地 Web 服务器上。 浏览器窗口随即打开并显示“Hello, World!”

  2. 关闭浏览器窗口,并通过在 Visual Studio Code 中按 shift+F5 来停止应用。

创建服务

现在,你已有一个工作应用,接下来让我们创建一个服务来生成主页的欢迎消息。

  1. 右键单击资源管理器窗格中的 MyWebApp 项目。 选择 “新建文件夹”。 将文件夹命名为“服务”。

  2. 右键单击“服务”文件夹。 选择 “新建文件”。 将文件命名 为WelcomeService.cs

  3. 将 WelcomeService.cs 的内容替换为以下代码

    namespace MyWebApp.Services;
    
    public class WelcomeService : IWelcomeService
    {
    
        DateTime _serviceCreated;
        Guid _serviceId;
    
        public WelcomeService()
        {
            _serviceCreated = DateTime.Now;
            _serviceId = Guid.NewGuid();                
        }
    
        public string GetWelcomeMessage()
        {
            return $"Welcome to Contoso! The current time is {_serviceCreated}. This service instance has an ID of {_serviceId}";
        }
    }
    

    此代码使用生成欢迎消息的 WelcomeService 方法定义 GetWelcomeMessage 类。 该消息包含了服务创建时的当前时间,以及每个服务实例的唯一标识符。

    请注意,_serviceCreated_serviceId 字段需要在构造函数中进行设置,并且在服务实例的生命周期内始终保持不变。

注册该服务

现在你已经有了一个服务,接下来需要将其注册到服务容器中。

  1. 打开 Program.cs 文件。

  2. 将下面的 指令添加到文件的顶部:

    using MyWebApp.Services;
    

    此指令解析对 WelcomeService 类的引用。

  3. 紧接在 var builder = WebApplication.CreateBuilder(args); 行之后,添加以下代码:

    builder.Services.AddSingleton<WelcomeService>();
    

    WebApplication.CreateBuilder 创建名为 WebApplicationBuilderbuilder 类的新实例。 前面的代码使用单一实例生存期向服务容器注册 WelcomeService 类。

  4. app.MapGet("/", () => "Hello World!"); 行更改为以下代码:

    app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    

    此代码将 HTTP GET 请求映射到根 URL (/),指向一个委托,该委托返回由 WelcomeService 服务生成的欢迎消息。

    Program.cs 文件应如下所示

    using MyWebApp.Services;
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddSingleton<WelcomeService>();
    
    var app = builder.Build();
    
    app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    
    app.Run();
    

测试更改

  1. 保存所有更改并像以前一样运行应用。
  2. 浏览器窗口打开时,请注意,根 URL 会显示 WelcomeService 服务生成的欢迎消息。
  3. 关闭浏览器窗口,并通过在 Visual Studio Code 中按 shift+F5 来停止应用。

使用接口

团队评审你的代码,另一位开发人员建议你使用接口注册服务,因为此方法使代码更加灵活且更易于维护。

  1. 右键单击资源管理器窗格中的 MyWebApp 项目。 选择 “新建文件夹”。 将文件夹命名为“接口”

  2. 右键单击“接口”文件夹。 选择 “新建文件”。 将文件命名 为IWelcomeService.cs

  3. 将 IWelcomeService.cs 的内容替换为以下代码

    namespace MyWebApp.Interfaces
    
    public interface IWelcomeService
    {
        string GetWelcomeMessage();
    }
    

    此代码使用 IWelcomeService 方法定义 GetWelcomeMessage 接口。 实现此接口的任何服务都必须为 GetWelcomeMessage 方法提供实现。

  4. 打开 Services/WelcomeService.cs 文件

  5. 将下面的 指令添加到文件的顶部:

    using MyWebApp.Interfaces;
    

    此指令解析对下一步中添加 IWelcomeService 接口的引用。

  6. 更新 WelcomeService 类声明以实现 IWelcomeService 接口:

    public class WelcomeService : IWelcomeService
    

    这是为实现 WelcomeService 接口而唯一需要对 IWelcomeService 类进行的更改。 WelcomeService 类已经有一个与 GetWelcomeMessage 接口中的方法签名匹配的 IWelcomeService 方法。

  7. 打开 Program.cs 文件。

  8. builder.Services.AddSingleton<WelcomeService>(); 行更新为以下代码:

    builder.Services.AddSingleton<IWelcomeService, WelcomeService>();
    

    此代码使用 WelcomeService 接口将 IWelcomeService 类注册到服务容器。

    提示

    可将此内容视为“当组件请求 IWelcomeService 时,提供实例 WelcomeService”。

  9. app.MapGet("/", (WelcomeService welcomeService) => welcomeService.GetWelcomeMessage()); 行更新为以下代码:

    app.MapGet("/", (IWelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    

    匿名函数现在需要 IWelcomeService 而不是 WelcomeService

    Program.cs 文件应如下所示

    using MyWebApp.Interfaces;
    using MyWebApp.Services;
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddSingleton<IWelcomeService, WelcomeService>();
    
    var app = builder.Build();
    
    app.MapGet("/", (IWelcomeService welcomeService) => welcomeService.GetWelcomeMessage());
    
    app.Run();
    

测试更改

让我们测试应用,确保应用仍按预期工作。

  1. 保存所有更改并像以前一样运行应用。
  2. 浏览器窗口打开时,请注意,根 URL 会显示 WelcomeService 服务生成的欢迎消息。
  3. 请让应用保持运行状态以完成下一个练习。