在 C# 中,依赖注入(Dependency Injection,DI)是一种设计模式,用于处理组件之间的依赖关系。它有助于降低组件之间的耦合度,并使代码更容易测试、维护和扩展。
依赖注入的核心思想是将一个对象所需的依赖关系从其本身解耦,而是通过外部提供这些依赖,通常通过构造函数、属性或方法参数来实现。这种模式允许组件专注于自身的职责,而不需要知道如何创建或获取它所依赖的对象。
例如,考虑一个服务类 UserService
需要依赖于 UserRepository
来执行数据库操作。在依赖注入中,可以这样处理:
public interface IUserRepository
{
void Save(User user);
User GetById(int userId);
// 其他方法...
}
public class UserRepository : IUserRepository
{
// 实现 IUserRepository 接口的具体逻辑...
}
public class UserService
{
private readonly IUserRepository _userRepository;
// 通过构造函数注入依赖
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
// UserService 使用 _userRepository 进行操作...
}
在这个例子中:
UserService
类需要一个IUserRepository
类型的实例来执行数据库操作。- 构造函数
UserService
接受一个IUserRepository
参数,并将其保存在私有字段_userRepository
中。 - 当创建
UserService
实例时,需要提供一个实现了IUserRepository
接口的对象。这个对象可以是UserRepository
类的实例或者是实现了该接口的其他类的实例。
通过依赖注入,UserService
不需要直接创建 UserRepository
的实例,而是依赖于外部传入的 IUserRepository
实例。这样做的好处是,可以更轻松地替换实际的数据库操作实现,例如在测试中使用模拟的存储库来模拟数据库行为,而不必改变 UserService
的实现。
依赖注入容器(如.NET Core 中的内置 DI 容器)能够自动管理依赖项的创建和注入,进一步简化了依赖关系的管理。