angular2依赖注入 - 多层 - 组件需要知道太多

时间:2016-08-02 18:35:26

标签: angular2-services

我已经阅读了大部分/全部SO angular2 DI问题并且更接近我的目标但不完全。

我希望有一个SvgA实例(跨组件共享),但每个服务都有自己的子服务实例(SubSvc)。

我想我理解了很多DI:如果我在顶级声明SvcA,那么所有组件将共享一个实例,但是如果我在'提供商中声明它?对于ComponentOne,它将获得自己的SvcA实例。

我找到了两个解决方案,但它们都有缺点 - 我想知道我是否错过了另一个解决方案。

解决方案1 ​​

index.ts

import {SvcA} from 'svc_a';
import {SvcB} from 'svc_b';
export const APP_PROVIDERS = [ SvcA, SvcB ];

componentOne.ts

(no providers set)
constructor( http: Http, svca: svcA ) {}

svc_a.ts

@Injectable()
export class SvcA {
constructor(http:Http) {
    subsvc = new SubSvc(http); // this works - but doesn't use DI for SubSvc
    subsvc.configure( stuff )

sub_svc.ts

@Injectable()
export class SubSvc {
    private http: Http;
    constructor( http: Http ) {}

解决方案2

componentOne.ts

providers: [SvcA, SubSvc]
constructor( http: Http, svca: SvcA ) {}

svc_a.ts

@Injectable()
export class SvcA {
constructor(http: Http, @Inject(SubSvc) subSvc: SubSvc) {
subsvc.configure( stuff )

第一个解决方案并没有使用DI作为subvc,我不喜欢。

第二种解决方案使用DI,但要求ComponentOne知道SubSvc的某些内容,即使它没有直接使用它。

1 个答案:

答案 0 :(得分:2)

这是Angular 2的设计缺陷(漏洞抽象)。您可以将子服务注入服务,而无需为外部子服务定义提供程序。即使将Http注入SvcA,也必须在外部componentOne中指定其提供者。在这方面,将SubSvc注入SvcA与将Http注入SvcA没有什么不同。

我不知道任何优雅的解决方案。

我在Angular的GitHub中打开了这个问题:https://github.com/angular/angular/issues/5622