C# (.NET) 依赖注入容器:完整指南
依赖注入 (DI) 是现代 C# 和 .NET 开发中的关键设计模式之一。它允许创建低耦合、可测试且易于维护的应用程序。在本文中,我们将详细探讨什么是依赖注入容器,如何在 .NET 中使用它,并提供实用的代码示例。
什么是依赖注入?
依赖注入是一种模式,其中对象从外部获取其依赖项,而不是自行创建它们。这允许:
- 减少组件之间的耦合
- 简化测试(能够用模拟对象替换依赖项)
- 提高代码的灵活性和可重用性
- 集中管理对象的生命周期
什么是 DI 容器?
DI 容器(或 IoC 容器)是一个库,它自动化了依赖注入的过程。它负责创建对象并管理其生命周期。在 .NET 中,主要的 DI 容器是 Microsoft.Extensions.DependencyInjection,它内置于 ASP.NET Core 中,并可用于任何 .NET 应用程序。
DI 容器的基本概念
DI 容器操作以下概念:
- 服务注册 — 将类型及其实现添加到容器的过程
- 依赖项解析 — 自动创建具有其依赖项的对象
- 服务生命周期 — 定义对象存在的时间(瞬态、作用域、单例)
在 .NET 中配置 DI 容器
要开始使用 DI 容器,需要安装 Microsoft.Extensions.DependencyInjection 包。可以通过 NuGet 完成:
dotnet add package Microsoft.Extensions.DependencyInjection安装后,创建一个 ServiceCollection 实例,在其中注册所有依赖项:
using Microsoft.Extensions.DependencyInjection;
// 创建服务集合var services = new ServiceCollection();
// 注册服务services.AddTransient<ILogger, ConsoleLogger>();services.AddScoped<IUserRepository, UserRepository>();services.AddSingleton<IConfiguration, AppConfiguration>();
// 构建服务提供程序var serviceProvider = services.BuildServiceProvider();DI 容器使用示例
考虑一个实际示例:一个用户管理应用程序。创建接口及其实现:
public interface IUserRepository{ User GetUser(int id);}
public interface IEmailService{ void SendEmail(string to, string subject);}
public class UserRepository : IUserRepository{ public User GetUser(int id) { // 从数据库获取用户的逻辑 return new User { Id = id, Name = "John Doe" }; }}
public class EmailService : IEmailService{ public void SendEmail(string to, string subject) { Console.WriteLine($"Email sent to {to}: {subject}"); }}现在创建一个使用这些依赖项的 UserService 类:
public class UserService{ private readonly IUserRepository _userRepository; private readonly IEmailService _emailService;
public UserService(IUserRepository userRepository, IEmailService emailService) { _userRepository = userRepository; _emailService = emailService; }
public void NotifyUser(int userId) { var user = _userRepository.GetUser(userId); _emailService.SendEmail(user.Email, "Welcome!"); }}将所有内容注册到 DI 容器中