我有多个继承自基类的类。
基类应包含Http实例,以便子类除了逻辑之外还可以发出HTTP调用。问题是子类需要从构造函数中调用super方法,但我不想从下到上传递HTTP实例。
有什么想法吗?
export abstract class AuthBaseService {
constructor(protected http: Http) {
}
public abstract login(credentials);
public abstract logout();
}
export class FacebookProviderAuthService extends AuthBaseService {
constructor(private facebookAuth: Auth) {
// **PROBLEM : I MUST CALL SUPER HERE**
}
// Login & Logout impl.
}
答案 0 :(得分:1)
我不确定你的意思是不想从下往上传递它。 AuthBaseService类是抽象的,因此无法创建实例。必须从子类中注入所有依赖项,因为任何DI框架只能访问子类的实例。这确实没有打破依赖注入的想法,并且得到了我见过的大多数DI框架的支持。 FacebookProviderAuthService依赖于Http实例,因此它希望传入它。
当然,一种解决方法是在超类构造函数中实现Http实例,但这肯定会破坏依赖性反转。我想我不确定问题是什么。在我看来,这似乎不是一个问题。
这样想。假设您要对FacebookProviderAuthService进行单元测试。如果它没有将Http依赖作为其构造函数的一部分,那么你将如何模拟它? FacebookProviderAuthService需要明确其依赖关系,即使其中一些依赖关系来自基础抽象类。
答案 1 :(得分:0)
这是你必须要做的。如果你没有在某个地方传递它,基类会从哪里得到它的Http实例?这就是继承的工作原理。
您可以创建名为ApiService的单独服务,并在其中添加发送post / get请求和将auth令牌附加到每个服务的功能。然后将其注入需要它的服务类中。