从另一个模块导入服务

Ale*_* D. 5 typescript angular-providers ng-modules angular5

在使用 AngularJS 1.x 框架开发了 2 年之后,我目前正在学习 Angular 框架(版本 5),所以我问自己很多问题,其中之一是如何正确导入另一个模块提供的服务我的申请。

假设我有一个CoreModule提供服务的示例MyService,假设该项目具有以下文件树:

app/
   app.module.ts
   ...
pages/
   clients/
      clients.component.html
      clients.component.css
      clients.component.ts
   ...
core/
   core.module.ts
   providers/
      my-service.service.ts
Run Code Online (Sandbox Code Playgroud)

现在假设我的页面需要从模块clients注入服务。为此,我将放入模块的提供者列表中。我将导入我的.MyServiceCoreModuleMyServiceCoreModuleCoreModuleAppModule

如果我很好理解,通过执行这样的导入,我会告诉我的应用程序MyService在模块的 .ts 文件中需要该服务时使用该服务AppModule

但我无法理解的是在我的应用程序代码中包含声明服务的 .ts 文件。事实上,如果我想使用该MyService服务,我会在课堂上做类似的事情Clients

constructor(private service: MyService) {
   // using of the injected service
}
Run Code Online (Sandbox Code Playgroud)

但 TypeScript 需要声明服务的 .ts 文件的引用。我的第一次尝试是按照文件树导入文件:

import { MyService } from '../../core/providers/my-service.service';
Run Code Online (Sandbox Code Playgroud)

但这对我来说感觉不对,因为当我导入 Angular 服务时,我不必指定访问声明相关服务的文件的路径。服务示例HttpClient

import { HttpClient } from '@angular/common/http';
Run Code Online (Sandbox Code Playgroud)

实际上,我希望能够通过引用模块而不是传递 .ts 文件的路径来在应用程序页面中导入核心服务。

那时,我不知道这是否可能,或者我是否误解了其他模块的服务的使用。

Que*_*wer 1

当你这样做时

constructor(private service: MyService) {
   // using of the injected service
}
Run Code Online (Sandbox Code Playgroud)

您正在将依赖项注入此类。这意味着 Angular 将创建一个MyService类的实例,并在创建时将其传递给组件的构造函数。

当你这样做时

import { MyService } from '../../core/providers/my-service.service';
Run Code Online (Sandbox Code Playgroud)

这只是表明 TypeScript 存在这样的类,您引用的是哪个类,并且还允许 TypeScript 正确执行类型检查。它只不过是指向确切MyService类位置的指针,因为您可能在不同的文件中有多个具有此类名称的类。

我不会说这HttpClient是一个服务,只是一个普通的班级助手。

所以,所有工作仍然在构造函数声明级别完成。这是针对 Angular 和依赖注入的。额外的导入主要是针对 TypeScript 的。