ASP.NET IServiceCollection
最后修改于 2025 年 4 月 3 日
在本文中,我们将探讨 ASP.NET 8 中的 IServiceCollection。此接口是 ASP.NET 应用程序中依赖注入的基础。依赖注入是现代 .NET 开发中的一项关键设计模式。
IServiceCollection 提供了将应用程序服务注册到不同生命周期的方法。然后,这些服务可以注入到控制器、中间件和其他组件中。这促进了松耦合和可测试性。
基本定义
IServiceCollection 是一个接口,代表服务描述符的集合。它是 Microsoft.Extensions.DependencyInjection 命名空间的一部分。该接口提供了将服务注册到 DI 容器的方法。
服务可以根据三种不同的生命周期进行注册:瞬时(transient)、作用域(scoped)和单例(singleton)。瞬时服务在每次请求时创建。作用域服务在每个客户端请求时创建一次。
单例服务只创建一次,并在应用程序的整个生命周期中重用。IServiceCollection 通常在应用程序启动期间在 Program.cs 文件中配置。
ASP.NET IServiceCollection 示例
以下示例演示了如何使用 IServiceCollection 在 ASP.NET 8 应用程序中配置服务。
var builder = WebApplication.CreateBuilder(args); // Configure services builder.Services.AddControllers(); builder.Services.AddScoped<IProductRepository, ProductRepository>(); builder.Services.AddTransient<IEmailService, EmailService>(); builder.Services.AddSingleton<ILoggerService, FileLoggerService>(); var app = builder.Build(); app.MapControllers(); app.Run();
此代码配置了三个具有不同生命周期的服务。AddScoped
方法注册了一个存储库,该存储库将为每个 HTTP 请求创建一次。AddTransient
在每次请求时创建一个新的电子邮件服务实例。
AddSingleton
注册了一个日志服务,该服务将在应用程序的整个生命周期中共享。AddControllers
方法添加了对 MVC 控制器的支持。
public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public Product(int id, string name, decimal price) { Id = id; Name = name; Price = price; } }
这是一个简单的 Product 模型类,将用于我们的存储库。它包含产品标识和定价的基本属性。
public interface IProductRepository { IEnumerable<Product> GetAllProducts(); Product GetProductById(int id); void AddProduct(Product product); }
IProductRepository 接口定义了我们的产品数据访问的契约。它包括检索和添加产品的方法。
public class ProductRepository : IProductRepository { private readonly List<Product> _products = new() { new Product(1, "Laptop", 999.99m), new Product(2, "Mouse", 19.99m), new Product(3, "Keyboard", 49.99m) }; public IEnumerable<Product> GetAllProducts() => _products; public Product GetProductById(int id) => _products.FirstOrDefault(p => p.Id == id); public void AddProduct(Product product) { product.Id = _products.Max(p => p.Id) + 1; _products.Add(product); } }
ProductRepository 实现 IProductRepository 接口。它为了演示目的使用了内存列表。在实际应用程序中,这将连接到数据库。
using Microsoft.AspNetCore.Mvc; [ApiController] [Route("api/[controller]")] public class ProductsController : ControllerBase { private readonly IProductRepository _productRepository; private readonly ILoggerService _logger; public ProductsController( IProductRepository productRepository, ILoggerService logger) { _productRepository = productRepository; _logger = logger; } [HttpGet] public IActionResult GetAllProducts() { _logger.Log("Fetching all products"); return Ok(_productRepository.GetAllProducts()); } [HttpGet("{id}")] public IActionResult GetProductById(int id) { var product = _productRepository.GetProductById(id); if (product == null) { _logger.Log($"Product with id {id} not found"); return NotFound(); } return Ok(product); } }
ProductsController 展示了依赖注入的实际应用。IProductRepository 和 ILoggerService 通过构造函数注入。控制器使用这些服务来处理 HTTP 请求。
GetAllProducts 方法从存储库返回所有产品。GetProductById 方法通过 ID 检索特定产品。这两种方法都利用了注入的服务。
来源
在本文中,我们探讨了 ASP.NET 8 中的 IServiceCollection。这项强大的功能实现了现代应用程序中清晰的依赖管理。正确使用依赖注入可以带来更易于维护和测试的代码。