2017-05-24 111 views
1

我有多个从基类继承的类。类继承和DI

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

回答

1

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

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

想想这样吧。假设你想单元测试FacebookProviderAuthService。如果它不将Http依赖作为其构造函数的一部分,那么您将如何将它嘲笑出来? FacebookProviderAuthService需要明确其依赖关系,即使这些依赖关系中的某些依赖来自基本抽象类。

0

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

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