类继承和DI

时间:2017-05-24 18:18:54

标签: angular typescript

我有多个继承自基类的类。

基类应包含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.
}

2 个答案:

答案 0 :(得分:1)

我不确定你的意思是不想从下往上传递它。 AuthBaseService类是抽象的,因此无法创建实例。必须从子类中注入所有依赖项,因为任何DI框架只能访问子类的实例。这确实没有打破依赖注入的想法,并且得到了我见过的大多数DI框架的支持。 FacebookProviderAuthService依赖于Http实例,因此它希望传入它。

当然,一种解决方法是在超类构造函数中实现Http实例,但这肯定会破坏依赖性反转。我想我不确定问题是什么。在我看来,这似乎不是一个问题。

这样想。假设您要对FacebookProviderAuthService进行单元测试。如果它没有将Http依赖作为其构造函数的一部分,那么你将如何模拟它? FacebookProviderAuthService需要明确其依赖关系,即使其中一些依赖关系来自基础抽象类。

答案 1 :(得分:0)

这是你必须要做的。如果你没有在某个地方传递它,基类会从哪里得到它的Http实例?这就是继承的工作原理。

您可以创建名为ApiService的单独服务,并在其中添加发送post / get请求和将auth令牌附加到每个服务的功能。然后将其注入需要它的服务类中。