依赖注入 DI
内置 DI 容器、Singleton/Scoped/Transient、服务注册
依赖注入 DI
ASP.NET Core 内置了依赖注入容器——在 Program.cs 中注册服务,构造函数自动注入。
学完本章你将: 掌握 Singleton/Scoped/Transient 生命周期、服务注册方式。
三种生命周期
csharp
// Singleton —— 整个应用共享一个实例
builder.Services.AddSingleton<ICacheService, RedisCache>();
// Scoped —— 每个请求一个实例(Web 应用最常用)
builder.Services.AddScoped<IUserRepository, UserRepository>();
// Transient —— 每次注入都创建新实例
builder.Services.AddTransient<IEmailSender, SmtpSender>();
服务注册方式
csharp
// 接口 → 实现
builder.Services.AddScoped<IService, ServiceImpl>();
// 同名类(不需要接口)
builder.Services.AddScoped<UserService>();
// 工厂方法
builder.Services.AddScoped<HttpClient>(sp => {
var client = new HttpClient();
client.BaseAddress = new Uri("https://api.example.com");
return client;
});
// 已有实例
builder.Services.AddSingleton(new Config { AppName = "MyApp" });
构造函数注入
csharp
public class UserController
{
private readonly IUserRepository _repo;
private readonly ILogger<UserController> _logger;
public UserController(
IUserRepository repo,
ILogger<UserController> logger)
{
_repo = repo;
_logger = logger;
}
public async Task<User?> GetUser(int id)
{
_logger.LogInformation("查询用户 {Id}", id);
return await _repo.FindByIdAsync(id);
}
}