一个简单的 ASP.NET Core 依赖注入例子,提高代码的可维护性和可扩展性

news/2025/1/12 18:10:39/文章来源:https://www.cnblogs.com/JackyGz/p/18521004

Coding-3

前言:什么是依赖注入

依赖注入可以提高代码的可维护性、可测试性、可替换性和可扩展性,降低组件之间的耦合度,使得代码更加清晰和灵活,ASP.NET Core 提供了内置的依赖注入容器,可以帮助我们轻松地将服务注册到容器中。

本文主要通过一个简单的例子来阐述 ASP.NET Core 依赖注入 的使用方式,我们通常在构造方法中注入,如果使用频率低,也可以通过方法参数直接注入到方法。

Step By Step 步骤

  1. 创建一个 Asp.NET Core Web API 项目

  2. 创建一个用于测试的服务类

    namespace 服务注入1;public class MyService1
    {public IEnumerable<string> GetNames(){return new string[] { "Tom", "Zack", "Jack" };}
    }
    
  3. 打开 Program.cs 编写注册此服务的代码

    using 服务注入1;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();// 注册自定义的服务
    builder.Services.AddScoped<MyService1>(); var app = builder.Build();// Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {app.UseSwagger();app.UseSwaggerUI();
    }app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();
    
  4. 在控制器中依赖注入方式使用此服务(重点看注释

    using Microsoft.AspNetCore.Mvc;
    using 服务注入1;namespace 服务注入1.Controllers
    {[ApiController][Route("[controller]/[action]")]public class WeatherForecastController : ControllerBase{// 1.定义自定义服务private readonly MyService1 _myService1;private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};private readonly ILogger<WeatherForecastController> _logger;// 2.通过构造方法注入public WeatherForecastController(ILogger<WeatherForecastController> logger, MyService1 myService1){_logger = logger;_myService1 = myService1;}[HttpGet(Name = "GetWeatherForecast")]public IEnumerable<WeatherForecast> Get(){return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();}// 3.直接使用服务的方法[HttpGet]public string Test2(string name){var names = _myService1.GetNames();return string.Join(",", names) + ",hello:" + name;}// 4.方法参数注入,用于使用频率比较低的服务// [FromServices] MyService1 _myService2// 只有 ASP.NET Core 的控制器类的操作方法才能用[FromServices]注入服务,普通的类是不支持这种写法的[HttpGet]public string Test([FromServices] MyService1 _myService2, string name){// 直接使用服务的方法var names = _myService2.GetNames();return string.Join(",", names) + ",hello:" + name;}}
    }
    

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎关注老杨的公众号(名称:代码掌控者),更多干货等你来

往期精彩

  1. C# 静态类,高手不想让你知道的 15 个真相
  2. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  3. 用 C# Stopwatch 计时,让代码性能飞起来!
  4. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  5. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  6. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  7. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  8. C# AutoMapper 10个常用方法总结
  9. C# 7个方法比较两个对象是否相等
  10. C# 去掉字符串最后一个字符的 4 种方法

image

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

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

相关文章

protobuf json

为什么大厂这么爱用protobuf? https://mp.weixin.qq.com/s/COQu3rckfZJUelSVBV6IMA 为什么大厂这么爱用protobuf? 原创 腾讯技术工程 腾讯技术工程 2024年10月30日 17:34 广东 话题背景 在protobuf在国内兴起的时候,json over http 的 RESTful ,api也在国内同步兴起了。司…

MS Projcet 和 Redmine 在进行项目管理的时候有什么区别

在进行项目管理的时候,MS Project和Redmine有以下主要的区别:1.平台属性不同;2.功能侧重点不同;3.使用者不同;4.兼容性不同;5.成本差异。总的来说,MS Project适用于规模较大、复杂度较高的项目管理,而Redmine适用于小型团队、开源社区以及迭代开发速度较快的项目管理。…

恶意 Prompt 攻击

黑掉大模型?恶意 Prompt 攻击成无解之谜? https://mp.weixin.qq.com/s/vliCct-0PwEdaGFSpYt9tQ 黑掉大模型?恶意 Prompt 攻击成无解之谜? 原创 Atone 腾讯技术工程 2024年11月01日 17:35 广东作者:Atone,混元安全防守团队成员 随着大模型应用的逐步发展,出现了一种新型的…

『模拟赛』多校A层冲刺NOIP2024模拟赛17

『模拟赛记录』多校A层冲刺NOIP2024模拟赛17Rank 一般A. 网络 签不上的签到题。 首先考虑枚举路径的做法,如果先枚举再计算的话复杂度会是 \(\mathcal{O(\binom{n+m-2}{n-1}(n+m))}\) 的,稍微优化一点的过程中可以去掉后面的 \((n+m)\)。考虑此时我们要记什么,首先遇到加号其…

rust学习五、认识所有权

在<<The rust programming language>>的中译版<<rust权威指南>>中,作者用了30页的篇幅来阐述这个问题。 如作者所言,所有权是学习rust语言的基础,不掌握这个,无需继续往下,所以,这是初学rust就必须会的。正是所有权概念和相关工具的引入,Rust才…

给予爱快路由器使用阿里云DDNS远程访问家庭网络

一、阿里云域名准备1、首先需要购买一个阿里云域名,选简短好记性价比高的即可,如果域名只是用来解析路由器IP地址,不做服务器类应用,则不需要备案。 2、想做动态域名解析,光有域名还不行,还需要在阿里云控制台建立一个访问授权,路由器才能动态同步远营商的IP地址到DNS服…

KingbaseES V8R6集群备份恢复案例之---主库single-pro备份恢复

KingbaseES、repmgr、sys_rman案例说明: KingbaseES V8R6集群物理备份支持single-pro方式,本案例在集群执行single-pro方式备份并多次切换集群后,对集群执行了恢复测试,文档记录了恢复的详细过程。 适用版本: KingbaseES V8R6 集群架构:ID | Name | Role | Status …

号码变换配置对接运营商IMS

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 fs直接对接运营商,调试过程中的号码变换规则比较容易出问题。 本文档记录一个较为通用的对接IMS配置方案。 环境 CentOS 7.9 freeswitch 1.10.7 模块配置 号码变换主要使用mod_translate模块和dialplan拨号计划实现。 确…

Idea上Git仓库不见了是什么原因

在使用IntelliJ IDEA进行项目开发时,Git仓库突然消失是开发者常遇到的问题。该问题可能由多个因素引起,包括:1.环境配置问题;2.软件或插件更新;3.目录结构变更;4.用户权限问题;5.其他软件干扰。理解这些因素并采取相应的解决措施,不仅能快速恢复Git仓库,还能避免类似问…

【算法学习】扫描线

这篇题解写的难以言喻,可能只有我能看的懂! 前言 虽然我觉得这个算法目前不太可能会考,但是我觉得挺有意思的,而且学个算法也挺好,我是为自己学的!!! 定义 扫描线可以求二维图形的面积,也可以求周长等多种用途…… P5490 【模板】扫描线 & 矩形面积并 这就是扫描线…

leetcode 740 删除并获得点数

740 删除并获得点数 题意 给你一个整数数组 nums ,你可以对它进行一些操作。 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。 开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。…