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 和一个简单的日志服务。
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 容器。通过依赖注入,该服务将可供所有控制器使用。
public interface ITimeLogger
{
string LogTime(string message);
}
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 来演示为每次请求创建新实例。
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 值都会不同。
来源
在本文中,我们探讨了 ASP.NET 8 DI 中的 AddTransient 方法。这项强大的功能有助于在应用程序中有效管理服务生存期。