时间:2024-11-01 18:17
人气:
作者:admin

依赖注入可以提高代码的可维护性、可测试性、可替换性和可扩展性,降低组件之间的耦合度,使得代码更加清晰和灵活,ASP.NET Core 提供了内置的依赖注入容器,可以帮助我们轻松地将服务注册到容器中。
本文主要通过一个简单的例子来阐述 ASP.NET Core 依赖注入 的使用方式,我们通常在构造方法中注入,如果使用频率低,也可以通过方法参数直接注入到方法。
创建一个 Asp.NET Core Web API 项目
创建一个用于测试的服务类
namespace 服务注入1;
public class MyService1
{
public IEnumerable<string> GetNames()
{
return new string[] { "Tom", "Zack", "Jack" };
}
}
打开 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();
在控制器中依赖注入方式使用此服务(重点看注释)
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年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎关注老杨的公众号(名称:代码掌控者),更多干货等你来

如何在 DotNet 中使用类似 golang 的 vendor 的