Dependency injection 如何正确设置仅导出Angular2中其他类的文件的提供程序

Dependency injection 如何正确设置仅导出Angular2中其他类的文件的提供程序,dependency-injection,typescript,angular,Dependency Injection,Typescript,Angular,参见plunker: 我们正在Angular2项目上使用Typescript,该项目目前在Angular2-beta.12上。我们有一个目录结构,如下所示 ├── feature1 | ├── feature1.component.ts | ├── feature1.service.ts | ├── feature1.action.ts | └── feature1.model.ts ├── feature2.ts ├── feature2 | └── feature2.se

参见plunker:

我们正在Angular2项目上使用Typescript,该项目目前在Angular2-beta.12上。我们有一个目录结构,如下所示

├── feature1
|   ├── feature1.component.ts
|   ├── feature1.service.ts
|   ├── feature1.action.ts
|   └── feature1.model.ts
├── feature2.ts
├── feature2
|   └── feature2.service.ts
功能2.ts包含:

export * from './feature1/feature2.service';
feature1/feature1.service看起来像:

import {Injectable} from "angular2/core";
import {Feature2Service} from "../feature2

@Injectable()
export class Feature1Service {
    constructor(protected _feature2Service:Feature2Service) {
    }
}
import {Component, OnInit} from "angular2/core";
import {Feature1Service} from "./feature1.service";

@Component({
    selector: "my-feature1",
    templateUrl: "./feature1.html",
    providers: [Feature1Service]
})

export class Feature1Component implements OnInit {
    constructor() {
    }
    ngOnInit() {
    }
}
feature1/feature1.0组件看起来像:

import {Injectable} from "angular2/core";
import {Feature2Service} from "../feature2

@Injectable()
export class Feature1Service {
    constructor(protected _feature2Service:Feature2Service) {
    }
}
import {Component, OnInit} from "angular2/core";
import {Feature1Service} from "./feature1.service";

@Component({
    selector: "my-feature1",
    templateUrl: "./feature1.html",
    providers: [Feature1Service]
})

export class Feature1Component implements OnInit {
    constructor() {
    }
    ngOnInit() {
    }
}
feature2.service.ts看起来像:

import {Injectable} from "angular2/core";

@Injectable()
export class Feature2Service {
    constructor() {
    }
}
当仅使用
feature2.ts
文件从feature1引用feature2时,生成的传输代码似乎认为应该提供
feature2
,但如果我们在导入中直接引用
feature2/feature2.service
文件,则传输代码将正确设置

从“feature2.ts”使用
import{Feature2Service}时传输代码

setters:[
    function (feature2_1_1) {
        feature2_1 = feature2_1_1;
    }
]
从“./feature2/feature2.service”
使用导入{Feature2Service}时传输的代码:

我在feature1.ts文件(基于node_modules/angular2/ts/http.ts文件)中使用了许多不同的方法构造提供者块,但没有任何运气

在浏览器和我们的单元测试中,所有这些都会产生如下错误:

异常:无法解析“Feature1Service”(未定义)的所有参数。确保所有参数都用Inject修饰或具有有效的类型批注,并且“Feature1Service”用Injectable修饰

这似乎很基本,但我缺少什么?我希望能够通过使用这些功能的单一导出文件来简化我们的导入,这是一个过于简化的示例,但是我们有很多功能,它们有很多组件和不同的模型,所以清理导入,这样我们所有的开发人员就不需要知道所有目录结构的复杂性了


谢谢

您尝试过@Inject吗?:

import {Injectable,Inject} from "angular2/core";
import {Feature1Service} from "../feature1";

@Injectable()
export class Feature2Service {
    constructor(@Inject(Feature1Service) protected _feature1Service:  Feature1Service) {
    }
}

你试过@Inject吗

import {Injectable,Inject} from "angular2/core";
import {Feature1Service} from "../feature1";

@Injectable()
export class Feature2Service {
    constructor(@Inject(Feature1Service) protected _feature1Service:  Feature1Service) {
    }
}

第一个问题:在feature1.service.ts中,您正在从feature2.service导入FeatureService,但您的feature2.service正在导出Feature2Service,因此您应该对此进行更改

而不是:

import {Injectable} from "angular2/core";
import {FeatureService} from "../feature2/feature2.service";


@Injectable()
export class Feature1Service {
   constructor(protected _feature2Service: Feature2Service) {}
}
你应使用:

import {Injectable} from "angular2/core";
import {Feature2Service} from "../feature2/feature2.service";


@Injectable()
export class Feature1Service {
   constructor(protected _feature2Service: Feature2Service) {}
}
第二个问题:服务必须先注册为提供商,然后才能使用,因此您有两个选择-或者在基本app.component中将其注册为提供商,这意味着您的服务将在所有组件中共享,或者您只能在需要它的组件中注册。请注意,所有子组件都将继承它。 因此,在feature1.component中,您应该执行以下操作:

...
import {Feature2Service} from "../feature2/feature2.service";

@Component({
   selector: "my-feature1",
   template: `
      <span>THIS IS MY FEATURE 1</span>
   `,
   providers: [Feature1Service, Feature2Service]
})
...
。。。
从“./feature2/feature2.service”导入{Feature2Service};
@组成部分({
选择器:“my-feature1”,
模板:`
这是我的特写1
`,
提供者:[功能1服务,功能2服务]
})
...

请参阅正在工作的插件:

第一个问题:在feature1.service.ts中,您正在从feature2.service导入FeatureService,但您的feature2.service正在导出Feature2Service,因此您应该对此进行更改

而不是:

import {Injectable} from "angular2/core";
import {FeatureService} from "../feature2/feature2.service";


@Injectable()
export class Feature1Service {
   constructor(protected _feature2Service: Feature2Service) {}
}
你应使用:

import {Injectable} from "angular2/core";
import {Feature2Service} from "../feature2/feature2.service";


@Injectable()
export class Feature1Service {
   constructor(protected _feature2Service: Feature2Service) {}
}
第二个问题:服务必须先注册为提供商,然后才能使用,因此您有两个选择-或者在基本app.component中将其注册为提供商,这意味着您的服务将在所有组件中共享,或者您只能在需要它的组件中注册。请注意,所有子组件都将继承它。 因此,在feature1.component中,您应该执行以下操作:

...
import {Feature2Service} from "../feature2/feature2.service";

@Component({
   selector: "my-feature1",
   template: `
      <span>THIS IS MY FEATURE 1</span>
   `,
   providers: [Feature1Service, Feature2Service]
})
...
。。。
从“./feature2/feature2.service”导入{Feature2Service};
@组成部分({
选择器:“my-feature1”,
模板:`
这是我的特写1
`,
提供者:[功能1服务,功能2服务]
})
...

请参阅正在工作的plunker:

feautre1/feature1.component.ts看起来如何?@GünterZöchbauer在问题中补充道:这应该有效。我试了一下这个小东西:。这让我想到了循环依赖。更新了plunker以更准确地反映项目问题。事实证明,这是特定于包含angular2/routerHow的
feautre1/feature1.component.ts
看起来像什么?@GünterZöchbauer在问题中补充说这应该有效。我试了一下这个小东西:。这让我想到了循环依赖。更新了plunker以更准确地反映项目问题。事实证明,如果参数具有相同类型的受保护特性,则angular2/router
@Inject(Feature1Service)
的包含是多余的。\u Feature1Service:Feature1Service我已经尝试过,但没有区别。此外,DI周围的文档似乎表明这是不必要的。我修改了示例并添加了一个plunker,尽管不管导入看起来如何,plunker似乎都不起作用,所以我可能还有其他事情要做。
@Inject(Feature1Service)如果参数的类型与受保护的类型相同,则
是多余的我已经尝试过,但没有区别。此外,DI周围的文档似乎表明这是不必要的。我修改了这个示例并添加了一个plunker,尽管不管导入看起来是什么样子,plunker似乎都不起作用,所以可能我还有其他事情要做。哇,你说得对。我看到FeatureService输入错误导致了一个我以前从未见过的错误,类似于“feature2service没有提供程序”,这更有用。我想知道从beta 8版切换到beta 14版是否改善了错误消息传递,但很明显,在修复了错误之后,出现了什么问题。再次感谢!不客气。我目前正在使用beta 13,但是错误消息和堆栈跟踪仍然很难读取。因此,虽然您的评论确实帮助修复了plunker,但我的实际项目似乎仍然遇到这些问题。我返回并验证了提供者的设置是否正确,服务主要是在根组件级别提供的。然而;我有一个简单的测试用例是un