练习 - 注册和使用服务
ASP.NET Core 应用通常需要跨多个组件访问相同的服务。 ASP.NET Core 使用内置依赖项注入容器来管理应用使用的服务。
你的团队负责人委托你为公司创建一个基本网站。 网站应在主页上显示欢迎消息。 你决定创建一个服务来生成欢迎消息。 然后,你将向服务容器注册该服务,以便可以将其注入到需要它的组件中。
创建 ASP.NET Core 应用
需要一个 ASP.NET Core 应用来扮演团队应用的角色。 让我们使用 Visual Studio Code 中的 C# 开发工具包扩展创建一个新的 ASP.NET Core 应用。
启动 Visual Studio Code。
按 Ctrl+Shift+P 打开命令面板。
搜索并选择 .NET: 新建项目...。
搜索并选择“ASP.NET Core 空”。
选择或创建新项目的文件夹。
将新应用命名为“MyWebApp”。
选择“创建项目”以创建项目。
当新项目打开时,展开
Solution Explorer窗格以查看项目文件。
运行应用
测试应用以确保它运行。
在 Visual Studio Code 中,按 F5 生成并运行应用。
- 出现提示时,选择“C#”作为调试程序。
- 出现提示时,选择“C#:MyWebApp [默认配置]”作为要使用的启动配置。
此命令启动应用并将其托管在本地 Web 服务器上。 浏览器窗口随即打开并显示“Hello, World!”
关闭浏览器窗口,并通过在 Visual Studio Code 中按 shift+F5 来停止应用。
创建服务
现在,你已有一个工作应用,接下来让我们创建一个服务来生成主页的欢迎消息。
右键单击资源管理器窗格中的 MyWebApp 项目。 选择 “新建文件夹”。 将文件夹命名为“服务”。
右键单击“服务”文件夹。 选择 “新建文件”。 将文件命名 为WelcomeService.cs。
将 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字段需要在构造函数中进行设置,并且在服务实例的生命周期内始终保持不变。
注册该服务
现在你已经有了一个服务,接下来需要将其注册到服务容器中。
打开 Program.cs 文件。
将下面的 指令添加到文件的顶部:
using MyWebApp.Services;此指令解析对
WelcomeService类的引用。紧接在
var builder = WebApplication.CreateBuilder(args);行之后,添加以下代码:builder.Services.AddSingleton<WelcomeService>();WebApplication.CreateBuilder创建名为WebApplicationBuilder的builder类的新实例。 前面的代码使用单一实例生存期向服务容器注册WelcomeService类。将
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();
测试更改
- 保存所有更改并像以前一样运行应用。
- 浏览器窗口打开时,请注意,根 URL 会显示
WelcomeService服务生成的欢迎消息。 - 关闭浏览器窗口,并通过在 Visual Studio Code 中按 shift+F5 来停止应用。
使用接口
团队评审你的代码,另一位开发人员建议你使用接口注册服务,因为此方法使代码更加灵活且更易于维护。
右键单击资源管理器窗格中的 MyWebApp 项目。 选择 “新建文件夹”。 将文件夹命名为“接口”。
右键单击“接口”文件夹。 选择 “新建文件”。 将文件命名 为IWelcomeService.cs。
将 IWelcomeService.cs 的内容替换为以下代码:
namespace MyWebApp.Interfaces public interface IWelcomeService { string GetWelcomeMessage(); }此代码使用
IWelcomeService方法定义GetWelcomeMessage接口。 实现此接口的任何服务都必须为GetWelcomeMessage方法提供实现。打开 Services/WelcomeService.cs 文件。
将下面的 指令添加到文件的顶部:
using MyWebApp.Interfaces;此指令解析对下一步中添加
IWelcomeService接口的引用。更新
WelcomeService类声明以实现IWelcomeService接口:public class WelcomeService : IWelcomeService这是为实现
WelcomeService接口而唯一需要对IWelcomeService类进行的更改。WelcomeService类已经有一个与GetWelcomeMessage接口中的方法签名匹配的IWelcomeService方法。打开 Program.cs 文件。
将
builder.Services.AddSingleton<WelcomeService>();行更新为以下代码:builder.Services.AddSingleton<IWelcomeService, WelcomeService>();此代码使用
WelcomeService接口将IWelcomeService类注册到服务容器。提示
可将此内容视为“当组件请求
IWelcomeService时,提供实例WelcomeService”。将
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();
测试更改
让我们测试应用,确保应用仍按预期工作。
- 保存所有更改并像以前一样运行应用。
- 浏览器窗口打开时,请注意,根 URL 会显示
WelcomeService服务生成的欢迎消息。 - 请让应用保持运行状态以完成下一个练习。

