Z
ZHANK
Web 开发

依赖注入 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);
    }
}