ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务

目录

一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务

1. app.Services

2. GetRequiredService()

3. Init()

二、应用场景

三、依赖注入使用拓展

1、使用场景

2、使用步骤

1. 定义服务接口和实现类

2. 注册服务到依赖注入容器

3. 使用依赖注入获取并执行服务

例子 1:在控制器中使用 DI 获取服务(控制器依赖注入)

例子 2:在中间件中使用 DI 获取服务(中间件依赖注入)

例子 3:在 Program.cs 中直接使用 DI 获取服务(项目启动获取服务)


一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务

今天看代码时候看到一句话,知识点接着学起来!!

await app.Services.GetRequiredService<InitService>().Init();

这句话是在 ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行某个服务的方法。

1. app.Services

appIApplicationBuilder 类型的对象,它用于配置请求处理管道。app.Services 获取的是 IServiceProvider,即服务提供者,用于解析和提供注册在依赖注入容器中的服务实例。

  • IServiceProvider 是 ASP.NET Core 中依赖注入(DI)机制的核心接口,用于从服务容器中解析已注册的服务。

2. GetRequiredService<InitService>()

GetRequiredService<T>()IServiceProvider 提供的方法,用于从 DI 容器中获取指定类型 T 的服务实例。

  • InitService 是某个自定义服务类(可能是应用程序启动时进行一些初始化操作的服务),通过 GetRequiredService<InitService>() 从 DI 容器中获取该服务的实例。

    • GetRequiredService<T>() 方法与 GetService<T>() 不同,它在容器中没有找到所请求的服务时,会抛出 InvalidOperationException 异常。相反,GetService<T>() 如果找不到服务,则会返回 null

3. Init()

InitService 类中有一个 Init 方法,它是一个自定义的方法,通常用于执行一些初始化任务(如数据库初始化、缓存加载、配置设置等)。

  • Init() 方法可能是一个异步方法,因此它被 await 关键字调用,表示它需要异步执行,执行完毕后,程序才能继续执行下去。

结合起来的含义

  • 从 ASP.NET Core 的依赖注入容器中获取 InitService 实例。
  • 调用 InitService 中的 Init 方法来进行一些初始化工作。
  • 使用 await 关键字,确保初始化操作完成之后,才继续执行后续的代码。

二、应用场景

这行代码常常出现在 ASP.NET Core 应用的启动阶段,特别是在 Program.csStartup.cs 文件中,通常用于执行应用启动时需要的一些初始化任务。例如:

  • 初始化数据库。
  • 加载应用配置。
  • 设置缓存或其他外部资源。

思考:

从这句话中 我们可以大致猜测,有一个类 类里边有一个Init方法:

public class InitService
{private readonly IMyDbContext _dbContext;public InitService(IMyDbContext dbContext){_dbContext = dbContext;}public async Task Init(){// 执行数据库初始化或其他启动任务await _dbContext.InitializeAsync();}
}

 因此,我们在 Program.cs 中,你可以使用

await app.Services.GetRequiredService<InitService>().Init();

来确保在应用启动时执行该初始化操作:

public class Program
{public static async Task Main(string[] args){var builder = WebApplication.CreateBuilder(args);// 注册服务builder.Services.AddScoped<InitService>();var app = builder.Build();// 在应用启动时执行初始化await app.Services.GetRequiredService<InitService>().Init();// 配置请求管道app.MapControllers();await app.RunAsync();}
}

三、依赖注入使用拓展

1、使用场景

在 ASP.NET Core 中,依赖注入(DI)是通过构造函数注入、属性注入或方法注入来实现的,通常我们会通过 IServiceProvider 来获取和执行某个服务。

一般有如下代码使用场景:

  • 构造函数注入:通过构造函数注入依赖的服务,最常见的 DI 方式。
  • 方法或属性注入:也可以使用方法或属性注入,但这些方法不如构造函数注入常见。
  • 中间件注入:ASP.NET Core 中间件也可以通过构造函数注入来获取 DI 容器中的服务。
  • IServiceProvider 获取服务:在一些情况下,可能需要在应用程序启动时或特定时刻获取服务,可以通过 IServiceProvider 来实现。

通过依赖注入,ASP.NET Core 提供了一个灵活且易于测试的架构,使得应用程序中的服务解耦并易于维护。

2、使用步骤

1. 定义服务接口和实现类

首先,我们定义一个简单的服务接口和它的实现类。

// 定义服务接口
public interface IMyService
{Task ExecuteAsync(string message);
}// 服务实现
public class MyService : IMyService
{public async Task ExecuteAsync(string message){await Task.Delay(1000);  // 模拟一些异步操作Console.WriteLine($"Executing MyService with message: {message}");}
}

2. 注册服务到依赖注入容器

Startup.csProgram.cs 中,我们需要将服务注册到 DI 容器中。通常,这些注册是在 ConfigureServices 方法中进行的。

public class Startup
{public void ConfigureServices(IServiceCollection services){// 注册 IMYService 接口及其实现类 MyServiceservices.AddSingleton<IMyService, MyService>();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){// 省略其他中间件配置...}
}

3. 使用依赖注入获取并执行服务

假设我们在 ControllerMiddleware 中需要执行 IMyService,可以通过构造函数注入的方式获取服务并执行。

例子 1:在控制器中使用 DI 获取服务(控制器依赖注入)
// Controller 示例
public class HomeController : Controller
{private readonly IMyService _myService;// 通过构造函数注入 IMyServicepublic HomeController(IMyService myService){_myService = myService;}public async Task<IActionResult> Index(){await _myService.ExecuteAsync("Hello from HomeController");return View();}
}
例子 2:在中间件中使用 DI 获取服务(中间件依赖注入)

在 ASP.NET Core 中,中间件也是可以使用 DI 来获取服务的。下面是如何在中间件中执行服务的一个例子:

public class MyMiddleware
{private readonly RequestDelegate _next;private readonly IMyService _myService;// 通过构造函数注入 IMyServicepublic MyMiddleware(RequestDelegate next, IMyService myService){_next = next;_myService = myService;}public async Task InvokeAsync(HttpContext context){// 在中间件中执行 IMyServiceawait _myService.ExecuteAsync("Hello from MyMiddleware");// 调用下一个中间件await _next(context);}
}

Startup.cs 中注册该中间件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{app.UseMiddleware<MyMiddleware>();  // 注册自定义中间件
}
例子 3:在 Program.cs 中直接使用 DI 获取服务(项目启动获取服务)

在某些情况下,我们可能需要在应用启动时直接获取并执行某个服务。例如,在 Program.cs 文件中。

public class Program
{public static async Task Main(string[] args){var host = CreateHostBuilder(args).Build();// 获取 DI 容器中的服务并执行using (var scope = host.Services.CreateScope()){var myService = scope.ServiceProvider.GetRequiredService<IMyService>();await myService.ExecuteAsync("Hello from Program.cs");}await host.RunAsync();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…

VLAN 基础 | 不同 VLAN 间通信实验

注&#xff1a;本文为 “ Vlan 间通信” 相关文章合辑。 英文引文&#xff0c;机翻未校。 图片清晰度限于原文图源状态。 未整理去重。 How to Establish Communications between VLANs? 如何在 VLAN 之间建立通信&#xff1f; Posted on November 20, 2015 by RouterSwi…

bat脚本实现自动化漏洞挖掘

bat脚本 BAT脚本是一种批处理文件&#xff0c;可以在Windows操作系统中自动执行一系列命令。它们可以简化许多日常任务&#xff0c;如文件操作、系统配置等。 bat脚本执行命令 echo off#下面写要执行的命令 httpx 自动存活探测 echo off httpx.exe -l url.txt -o 0.txt nuc…

堆的实现——堆的应用(堆排序)

文章目录 1.堆的实现2.堆的应用--堆排序 大家在学堆的时候&#xff0c;需要有二叉树的基础知识&#xff0c;大家可以看我的二叉树文章&#xff1a;二叉树 1.堆的实现 如果有⼀个关键码的集合 K {k0 , k1 , k2 , …&#xff0c;kn−1 } &#xff0c;把它的所有元素按完全⼆叉树…

edu小程序挖掘严重支付逻辑漏洞

edu小程序挖掘严重支付逻辑漏洞 一、敏感信息泄露 打开购电小程序 这里需要输入姓名和学号&#xff0c;直接搜索引擎搜索即可得到&#xff0c;这就不用多说了&#xff0c;但是这里的手机号可以任意输入&#xff0c;只要用户没有绑定手机号这里我们输入自己的手机号抓包直接进…

FRP通过公网IP实现内网穿透

FRP通过公网IP实现内网穿透 一、简介二、安装服务端1、下载2、安装FRP3、使用 systemd 命令管理 frps 服务4、设置 frps 开机自启动 三、安装客户端1、下载2、安装FRP3、使用 systemd 命令管理 frpc 服务4、设置 frpc 开机自启动 四、访问仪表盘 一、简介 frp 是一款高性能的反…

K8S学习笔记-------1.安装部署K8S集群环境

1.修改为root权限 #sudo su 2.修改主机名 #hostnamectl set-hostname k8s-master01 3.查看网络地址 sudo nano /etc/netplan/01-netcfg.yaml4.使网络配置修改生效 sudo netplan apply5.修改UUID&#xff08;某些虚拟机系统&#xff0c;需要设置才能生成UUID&#xff09;#…

go运算符

内置运算符 算术运算符关系运算符逻辑运算符位运算符赋值运算符 算术运算符 注意&#xff1a; &#xff08;自增&#xff09;和–&#xff08;自减&#xff09;在 Go 语言中是单独的语句&#xff0c;并不是运算符 package mainimport "fmt"func main() {fmt.Printl…

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;贪心算法篇–CSDN博客 文章目录 一.贪心算法1.什么是贪心算法2.贪心算法的特点 二.例题1.柠…

一款wordpress AI免费插件自动内容生成+前端AI交互+文章批量采集

一款wordpressAI自动内容生成前端AI会话窗口交互文章批量采集免费插件 1. SEO优化文章生成 关键词驱动的内容生成&#xff1a;用户可以输入关键词或长尾关键词&#xff0c;插件会根据这些关键词生成高质量的SEO优化文章。文章结构清晰&#xff0c;语言自然流畅&#xff0c;符合…

Linux03——常见的操作命令

root用户以及权限 Linux系统的超级管理员用户是&#xff1a;root用户 su命令 可以切换用户&#xff0c;语法&#xff1a;su [-] [用户名]- 表示切换后加载环境变量&#xff0c;建议带上用户可以省略&#xff0c;省略默认切换到root su命令是用于账户切换的系统命令&#xff…

使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南

文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;的应用逐渐成为技术热点&#xff0c;而 DeepSeek 作为国产开…

关于大数据

在大数据背景下存在的问题&#xff1a; 非结构化、半结构化数据&#xff1a;NoSQL数据库只负责存储&#xff1b;程序处理时涉及到数据移动&#xff0c;速度慢 是否存在一套整体解决方案&#xff1f; 可以存储并处理海量结构化、半结构化、非结构化数据 处理海量数据的速…

通过docker安装部署deepseek以及python实现

前提条件 Docker 安装:确保你的系统已经安装并正确配置了 Docker。可以通过运行 docker --version 来验证 Docker 是否安装成功。 网络环境:保证设备有稳定的网络连接,以便拉取 Docker 镜像和模型文件。 步骤一:拉取 Ollama Docker 镜像 Ollama 可以帮助我们更方便地管理…

企业四要素如何用PHP进行调用

一、什么是企业四要素&#xff1f; 企业四要素接口是在企业三要素&#xff08;企业名称、统一社会信用代码、法定代表人姓名&#xff09;的基础上&#xff0c;增加了一个关键要素&#xff0c;通常是企业注册号或企业银行账户信息。这种接口主要用于更全面的企业信息验证&#x…

Android性能优化系列——卡顿优化

卡顿&#xff0c;就是用户体感界面不流畅。我们知道手机的屏幕画面是按照一定频率来刷新的&#xff0c;理论上讲&#xff0c;24 帧的画面更新就能让人眼感觉是连贯的。但是实际上&#xff0c;这个只是针对普通的视频而言。对于一些强交互或者较为敏感的场景来说&#xff0c;比如…

激光工控机在自动化领域中有哪些作用?

首先是对于高精度加工控制方面&#xff1a;激光工控机能够精确控制激光光束的运动轨迹和输出功率&#xff0c;实现对各种材料的精细切割、雕刻和焊接&#xff0c;保证加工质量和效率。 其次还能实时监控与远程控制激光工控机凭借其强大的网络通信功能&#xff0c;可以实时监控…

陷入闭包:理解 React 状态管理中的怪癖

TLDR 闭包就像函数随身携带的背包&#xff0c;包含它们创建时的数据React 组件使用闭包来记住它们的状态和属性过时的闭包可能导致状态更新不如预期时的错误函数式更新提供了一个可靠的方式来处理最新状态 简介 你是否曾经疑惑过&#xff0c;为什么有时你的 React 状态更新不…

基于STM32的智能加湿器设计(新版本)

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 &#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是加湿器。设备的详细功能见网盘中的文章《12、基于…

21.2.2 保存

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 如果打开某个Excel文件修改后&#xff0c;需要保存到原文件或者用新的文件名保存&#xff0c;在 Excel.Application.Quit() 前使用W…