ZetCode

ASP.NET AddTransient

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 依赖注入中的 AddTransient 方法。此方法对于管理现代 Web 应用程序中的服务生存期至关重要。

ASP.NET Core 包含一个内置的依赖注入 (DI) 容器,可简化类依赖项的管理。AddTransient 是三种可用生存期选项之一。

基本定义

AddTransient 是一个用于在 ASP.NET Core 中向 DI 容器注册服务的方法。它为每次请求创建一个新的服务实例。

瞬态服务非常适合轻量级、无状态的服务,其中每个组件都需要自己的新实例。每次从服务容器请求它们时都会创建它们。

与 Singleton 或 Scoped 服务不同,瞬态服务永远不会共享。每次依赖注入都会产生一个新实例,从而从设计上保证了线程安全。

ASP.NET AddTransient 示例

以下示例演示了如何在 ASP.NET Core Web API 中使用 AddTransient 和一个简单的日志服务。

Program.cs
var builder = WebApplication.CreateBuilder(args);

// Register services
builder.Services.AddTransient<ITimeLogger, TimeLogger>();
builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();
app.Run();

这会将我们的 TimeLogger 服务注册为瞬态服务,从而设置 DI 容器。通过依赖注入,该服务将可供所有控制器使用。

Services/ITimeLogger.cs
public interface ITimeLogger
{
    string LogTime(string message);
}
Services/TimeLogger.cs
public class TimeLogger : ITimeLogger
{
    private readonly Guid _instanceId = Guid.NewGuid();
    
    public string LogTime(string message)
    {
        return $"[{DateTime.Now:HH:mm:ss}] {message} (Instance: {_instanceId})";
    }
}

TimeLogger 服务实现了 ITimeLogger,并包含一个唯一的 Guid 来演示为每次请求创建新实例。

Controllers/TimeController.cs
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("[controller]")]
public class TimeController : ControllerBase
{
    private readonly ITimeLogger _logger1;
    private readonly ITimeLogger _logger2;

    public TimeController(ITimeLogger logger1, ITimeLogger logger2)
    {
        _logger1 = logger1;
        _logger2 = logger2;
    }

    [HttpGet]
    public IActionResult Get()
    {
        var result1 = _logger1.LogTime("First call");
        var result2 = _logger2.LogTime("Second call");
        
        return Ok(new { result1, result2 });
    }
}

TimeController 通过注入两个 ITimeLogger 实例来演示瞬态行为。每个实例在输出中都会显示不同的 Guid,证明它们是独立的实例。

调用该终结点时,您将看到类似如下的输出,即使在同一请求中,每个日志记录器也具有不同的实例 ID。

{
    "result1": "[14:25:36] First call (Instance: 5a3b8c7d-6e5f-4a3b-9c8d-7e6f5a4b3c2d)",
    "result2": "[14:25:36] Second call (Instance: 9e8f7a6b-5c4d-3e2f-1a0b-9c8d7e6f5a4b)"
}

此示例清楚地表明了 AddTransient 如何为每次依赖注入创建新实例,即使在同一类中请求多个实例也是如此。每次请求终结点时,Guid 值都会不同。

来源

Microsoft ASP.NET 依赖注入文档

在本文中,我们探讨了 ASP.NET 8 DI 中的 AddTransient 方法。这项强大的功能有助于在应用程序中有效管理服务生存期。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 ASP.NET 教程