我有三个班级:
@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")
}
}
在Angular2中,我必须包含BaseService 和 MediaService的构造函数,即使MediaService继承了BaseService。
如何在没有MediaService构造函数的情况下将Angular2注入BaseService?
现在我将所有类扩展BaseService,这取决于ApiService从BaseService继承的时间。
答案 0 :(得分:1)
如果你想通过DI传递它,你必须使用构造函数。构造函数不是继承的,因此您需要在每个子类中实现构造函数,并通过调用super(arguments)
将参数传递给超类构造函数。
唯一的例外是默认构造函数,没有任何自动生成的参数。
您可以做的是注入Injector
并将其传递给超类,其中超类要求Http
强制要求Injector
。如果你注入多个服务,这可能有点优势,因为你只需要声明一个构造函数参数,但在我看来,这使得更难以推断代码。
答案 1 :(得分:1)
我认为这不是支持的东西。这是依赖注入在Angular2中的工作方式,即基于装饰器。 latter使用关联类的构造函数来确定必须注入的内容。您必须意识到TypeScript本身支持class和extends的概念,但这些代码被转换为JavaScript。
有关已转换代码的更多详细信息,请参阅此答案:
希望它可以帮到你, 亨利
答案 2 :(得分:0)
对于未来的读者,here是使用服务定位器解决此问题的示例的答案。