.NET Core 注入依赖

news/2025/1/3 12:48:07/文章来源:https://www.cnblogs.com/flydmxy/p/18643748

.NET Core 是一个现代化的、跨平台的框架,提供了构建高性能和可扩展应用程序的工具。依赖注入(Dependency Injection,DI)和中间件(Middleware)是 .NET Core 框架中两个核心的概念,它们在应用程序的架构中扮演着关键的角色。本文将详细探讨这两个概念,并展示如何在 .NET Core 应用程序中有效使用它们。

1. 依赖注入(Dependency Injection)
依赖注入是一种设计模式,用于将对象的依赖关系从外部传递给它,而不是在内部创建这些依赖。这种模式提高了代码的可测试性和可维护性。在 .NET Core 中,依赖注入是框架的内置功能,几乎所有的 .NET Core 应用程序都会用到它。

1.1 依赖注入的类型
在 .NET Core 中,有三种主要的依赖注入生命周期:

瞬态(Transient): 每次请求都会创建一个新的实例。适用于轻量级、无状态的服务。
作用域(Scoped): 在每个请求范围内创建一次实例。适用于需要在单个请求中共享数据的服务。
单例(Singleton): 在应用程序生命周期内只创建一次实例。适用于全局共享的服务,如缓存管理。
1.2 如何配置依赖注入
在 .NET Core 中,通过 Startup 类中的 ConfigureServices 方法来注册依赖关系。例如:

public void ConfigureServices(IServiceCollection services)
{// 注册一个瞬态服务,每次请求都会创建一个新的实例services.AddTransient<IMyTransientService, MyTransientService>();// 注册一个作用域服务,在每个请求范围内创建一次实例services.AddScoped<IMyScopedService, MyScopedService>();// 注册一个单例服务,在整个应用程序生命周期内只创建一次实例services.AddSingleton<IMySingletonService, MySingletonService>();
}

上面的代码展示了如何注册不同生命周期的服务。

1.3 使用依赖注入

一旦服务被注册,它们就可以通过构造函数注入到控制器或其他服务中:

public class MyController : ControllerBase
{private readonly IMyTransientService _transientService;private readonly IMyScopedService _scopedService;private readonly IMySingletonService _singletonService;// 通过构造函数注入服务依赖项public MyController(IMyTransientService transientService,IMyScopedService scopedService,IMySingletonService singletonService){_transientService = transientService;_scopedService = scopedService;_singletonService = singletonService;}// 你可以在控制器的方法中使用注入的服务public IActionResult MyAction(){_transientService.DoWork();_scopedService.DoWork();_singletonService.DoWork();return Ok();}
}

2. 中间件(Middleware)
中间件是处理 HTTP 请求和响应的组件链。在 .NET Core 中,每个请求都会通过一系列的中间件,最终返回响应。中间件的顺序非常重要,因为它决定了请求如何被处理。

2.1 中间件的类型
常见的中间件类型包括:

日志记录中间件: 记录请求和响应的数据。
身份验证中间件: 验证用户身份。
路由中间件: 将请求路由到相应的控制器。
2.2 配置中间件
在 Startup 类的 Configure 方法中配置中间件。例如:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{// 在开发环境中使用开发者异常页面中间件,以便调试错误if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}// 添加路由中间件,开始处理路由app.UseRouting();// 添加身份验证中间件,用于处理用户身份验证app.UseAuthentication();// 添加授权中间件,用于处理用户权限验证app.UseAuthorization();// 配置终结点路由,映射控制器路由app.UseEndpoints(endpoints =>{endpoints.MapControllers();});
}

上面的代码展示了一个典型的中间件配置,其中包括异常处理、路由、身份验证和授权等中间件。

2.3 自定义中间件

除了使用内置中间件,.NET Core 还允许开发者创建自定义中间件。例如:

public class CustomMiddleware
{private readonly RequestDelegate _next;// 构造函数中注入 RequestDelegate,用于调用下一个中间件public CustomMiddleware(RequestDelegate next){_next = next;}// 中间件的核心方法,处理传入的 HTTP 请求public async Task InvokeAsync(HttpContext context){// 在请求进入下一个中间件之前的处理逻辑// 例如:日志记录、请求修改等await _next(context); // 调用下一个中间件// 在请求返回之前的处理逻辑// 例如:修改响应、记录响应等}
}public void Configure(IApplicationBuilder app)
{// 在请求处理中添加自定义中间件app.UseMiddleware<CustomMiddleware>();
}

这个自定义中间件会在请求进入下一个中间件之前和响应返回之前进行处理。

3. 依赖注入与中间件的结合

在实际开发中,依赖注入和中间件通常会结合使用。中间件可以通过构造函数注入服务,以便在处理请求和响应时使用。例如:

public class LoggingMiddleware
{private readonly RequestDelegate _next;private readonly ILogger<LoggingMiddleware> _logger;// 通过构造函数注入日志服务和下一个中间件委托public LoggingMiddleware(RequestDelegate next, ILogger<LoggingMiddleware> logger){_next = next;_logger = logger;}// 中间件的核心方法public async Task InvokeAsync(HttpContext context){// 使用注入的日志服务记录请求信息_logger.LogInformation("Processing request: " + context.Request.Path);await _next(context); // 调用下一个中间件}
}

上面的代码展示了一个简单的日志中间件,它使用依赖注入的 ILogger 服务来记录请求信息。

4. 总结
依赖注入和中间件是 .NET Core 应用程序中不可或缺的组成部分。依赖注入提高了代码的可维护性和可测试性,而中间件则提供了一个灵活的方式来处理 HTTP 请求。通过正确地理解和使用这两个概念,开发者可以构建出更稳定、易于维护的应用程序。

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

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

相关文章

飞书lark机器人 自动化发版

开发飞书机器人接收消息并调用构建接口, 实现自动化发版 发送指令 -> 机器人接收指令 -> 调用jenkins-job远程构建与部署飞书lark机器人 自动化发版 #1 介绍开发飞书机器人接收消息并调用构建接口, 实现自动化发版发送指令 -> 机器人接收指令 -> 调用jenkins-job…

CloudflareSpeedTest优选IP

# 1.下载CloudflareSpeedTest CloudflareST_linux_amd64.tar.gz: https://url53.ctfile.com/f/62655553-1442843278-2c1830?p=7311 (访问密码: 7311) # 2.下载generate_hosts.sh generate_hosts.sh: https://url53.ctfile.com/f/62655553-1442843314-4dcbe5?p=7311 (访问密码…

随笔-处理器微架构-测量最大IPC

目录固定cpu运行频率max_ipc_test.shLSD (Loop Stream Detector)arm固定cpu频率方式 固定cpu运行频率 我的测试环境cpu频率管理是intel_pstate: $ lscpu | grep -i hz Model name: Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz CPU max MHz: …

6、RabbitMQ队列之主题【RabbitMQ官方教程】

在前面的教程中,我们改进了日志系统。我们没有使用只能进行虚拟广播的扇出交换机,而是使用了直接交换机,从而有可能选择性地接收日志。 虽然使用直接交换改进了我们的系统,但它仍然有局限性——它不能基于多个标准进行路由。 在我们的日志系统中,我们可能不仅要根据严重性…

石猴授徒-分支2-穿山大王

1-前面跟着任务跑,注意不要碰到"宫女" 2-在幻阵场景内点击各个NPC,战斗获得5个线索后,再重新点击其它NPC,提交线索。 注意:在归墟幻阵中通过传送门能够较快的移动,节约时间。3-提交5个线索后随机位置出现地洞,点击后可传送至“穿山大王府”。 4-在穿山大王府点…

KingbaseES 数据库备份恢复案例之---sys_rman备份进程异常

KingbaseES 、sys_rman案例说明: 执行sys_rman物理备份时,读取backup.info、backup.info.copy文件失败,sys_rman进程异常,无法正常结束服务,进程无法退出,阻塞新的备份任务。 适用版本:KingbaseES V8R6 一、问题现象 如下所示,sys_rman备份结束时,读取backup.info、ba…

养老服务市场潜力大,如何实现效率提升?——看板软件篇

通过引入看板软件,养老行业可以实现任务管理的可视化、协作的便捷化和资源的优化配置。这不仅提高了管理效率和服务质量,还为老年人提供了更加安全、舒适的养老服务环境。未来,随着技术的不断进步和应用的不断深化,看板软件将在养老行业中发挥更加重要的作用,为养老行业的…

易基因:单细胞WGBS揭示母源蛋白Pramel15调控早期胚胎发育的DNA甲基化重编程机制|NC/IF 14.7

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 哺乳动物的早期胚胎发育会经历重要的表观遗传重编程过程,这一过程需要重置从亲本基因组继承的表观遗传信息,以启动胚胎基因表达程序,而全基因组去甲基化对表观遗传重编程至关重要。哺乳动物基因组在CpG位点…

10个技巧,3分钟教会你github高效寻找开源项目(转)

作为程序员,不论是开发还是学习,肯定会用到开源项目,那么怎么快速在开源网站找到这些项目呢?常用的开源网站有:github 和 giteegithub是全球最大的开源社区,今天就以github为例,演示一下github界面一般来说,优秀的项目,维护会比较频繁,提交数也就会多一点。当然,一个…

Excel中使用VLOOKUP对两个单元格关联

一、背景 exl中需要关联两个Excel,根据主键合并两个单元格数据二、使用方法1、表1---列包含在id、姓名、年龄2、表2---列包含姓名、性别3、期望根据【姓名】列为主键,关联两个表数据,补充在【合并-性别】列 首先新增【合并-性别】列,然后选中期望填充的单元格,再点击2位置…