构造函数注入
- 优点:
- 依赖关系清晰,在创建对象时就明确所需依赖。
- 注入的依赖不可变,保证对象状态的稳定性。
- 缺点:
- 如果依赖过多,构造函数参数列表会很长,代码可读性变差。
- 不利于对象的复用,因为不同依赖需求可能需要不同构造函数。
- 示例:
type UserService struct {
userRepo UserRepository
}
func NewUserService(repo UserRepository) *UserService {
return &UserService{
userRepo: repo,
}
}
方法注入
- 优点:
- 灵活性高,可以在对象生命周期的任何阶段注入依赖。
- 对于已经存在的对象,不需要修改构造函数即可添加依赖。
- 缺点:
- 依赖关系不直观,阅读代码时较难快速确定对象依赖。
- 可能导致对象在未完全初始化依赖的情况下被使用。
- 示例:
type UserService struct {
userRepo UserRepository
}
func (us *UserService) SetUserRepository(repo UserRepository) {
us.userRepo = repo
}
字段注入
- 优点:
- 简单直接,代码量少,尤其是在使用框架进行自动注入时很方便。
- 适合处理对象内部不需要对外暴露的依赖。
- 缺点:
- 依赖关系不明确,没有显式的构造函数或方法来表明依赖。
- 测试时不太方便,因为无法直接控制注入的依赖。
- 示例:
type UserService struct {
userRepo UserRepository `inject:""`
}