Reputation: 10713
I have three classes:
@Injectable()
export class ApiService {
constructor(public http: Http) {}
get(url: string) {
return http.get(url);
}
}
@Injectable()
export abstract class BaseService {
constructor(protected serv: ApiService) {}
}
@Injectable()
export class MediaService extends BaseService {
// Why do we need this?
constructor(s: ApiService) {
super(s)
}
makeCall() {
this.serv.get("http://www.example.com/get_data")
}
}
In Angular2 I have to include for both the constructor of BaseService and MediaService even though MediaService inherits the BaseService.
How can I get Angular2 injection into the BaseService without having it in the constructor of MediaService?
Now I have all the classes extending the BaseService depending on the ApiService while they inherit from the BaseService.
Upvotes: 3
Views: 1460
Reputation: 202216
I think that it's not something supported. It's the way dependency injection works in Angular2, i.e. based on decorators. The latters uses the constructor of the associated class to determine what must be injected. You must be aware that the concept of class and extends are natively supported by TypeScript but such code is transpiled into JavaScript.
See this answer for more details about the transpiled code:
Hope it helps you, Thierry
Upvotes: 1
Reputation: 657676
If you want to get it passed in by DI you have to use the constructor. Constructors are not inherited therefore you need to implement the constructor in each and every subclass and pass arguments to the superclass constructor by calling super(arguments)
.
The only exception are default constructors without any arguments which are kinda autogenerated.
What you could do is to inject Injector
and pass it forward to the superclass where the superclass requests Http
from the Injector
imperatively. This might be a bit of an advantage if you inject multiple services because you only have to declare one constructor argument but in my opinion this makes it harder to reason about the code.
Upvotes: 1