前言:什么是依赖注入
依赖注入可以提高代码的可维护性、可测试性、可替换性和可扩展性,降低组件之间的耦合度,使得代码更加清晰和灵活,ASP.NET Core 提供了内置的依赖注入容器,可以帮助我们轻松地将服务注册到容器中。
本文主要通过一个简单的例子来阐述 ASP.NET Core 依赖注入 的使用方式,我们通常在构造方法中注入,如果使用频率低,也可以通过方法参数直接注入到方法。
Step By Step 步骤
- 创建一个 Asp.NET Core Web API 项目
- 创建一个用于测试的服务类
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; } } }