-3

我真的很想知道什么是提供者?angular2中与DI有什么关系?

app.module.ts

@NgModule({
  imports: [
    BrowserModule,
    FormsModule,
  ],
  declarations: [
    test,
  ],
  bootstrap: [ AppComponent ],
  providers: [
    userService
  ]
})
export class AppModule { }

测试组件.ts

export class TestComponent implements OnInit, OnDestroy {
constructor(public user: userService)
}

据我了解,提供者包含服务列表令牌,注入器会将这些服务令牌用于新的服务实例。服务必须在提供者中注册。

我不确定服务实例是由注入器还是提供者创建的?如果由注入器创建,为什么我们需要提供者?

4

3 回答 3

1

提供者是 DI 创建实例或获取需要传递给构造函数或使用injector.get(..).

providers: [
  MyService // short form for
  { provide: MyService, useClass: MyService },

  // create instance of `MyServiceMock` when `MyService` is requested
  { provide: MyService, useClass: MyServiceMock },  

  // redirect to a provider for `MyService` (^^^ use this one on the previous line)
  { provide: MyServiceMock, useExisting: MyService }, 

  // custom code to create an instance
  { provide: MyService, useFactory: (a, b) => new MyMockService(a, b), deps: [Http, new Inject('foo')]},

  { provide: 'foo', useValue: 'bar' }
]

(传递给的值provide: ...是查找提供者的令牌。另一个参数是用于创建实例的策略)

当 DI 创建一个类的实例时,它会读取创建实例所需的类的构造函数参数或deps提供程序的参数,以确定它需要传递给该构造函数以创建该实例的值。

@Inject(...)然后它搜索与这些必需参数值匹配的提供程序(通过构造函数参数的类型,或使用装饰器分配给构造函数参数的标记。

@Injectable() 
class MyService {}

@Component(...) 
class MyComponent {
  constructor(private myService:MyService) {}
}

当 Angular 需要一个MyComponent实例时,它会从 DI 请求它,为了让 DI 创建一个实例,它需要一个实例MyService才能将它传递给构造函数。DI 查找提供程序MyService并创建一个实例,或者如果之前已经创建了一个,则重新使用这个。

注册提供者的位置定义了将哪个实例或值传递给构造函数。
在此示例中,将注入组件提供程序的一个实例。
如果组件没有该providers: [MyService]行,则将@NgModule()注入来自提供者的实例:

@NgModule({
  ...
  providers: [MyService],
})

@Component({
  providers: [MyService], 
}) 
class MyComponent {
  constructor(private myService:MyService) {}
}

每个子组件都有自己的注入器,它是父组件注入器的子注入器。创建组件时,DI 在组件注入器中查找提供者,然后在父组件注入器中查找提供者,...,up too AppComponent,然后在@MgModule()注入器中查找。第一个具有所需令牌提供程序的注入器用于获取实例。这意味着在哪里提供提供者很重要。如果您将提供程序添加到组件,您将获得所提供服务的尽可能多的实例,因为存在组件实例。如果您添加一个提供程序,@NgModule(...) class AppModule{}那么整个应用程序中将只有一个实例。

延迟加载的模块增加了一些额外的复杂性。查看文档以获取更多详细信息。

于 2017-07-21T07:20:33.040 回答
0

该服务不是由 Injector 创建的。创建 Service 时,仅当您想在带注释的服务中注入另一个服务时才使用 @Injectable 注释。

每个服务都必须在 providers 数组中。如果您在 module.ts 中声明它,您将在每个组件中拥有相同的实例。如果您在组件的 providers 数组中声明它,则该实例将只能访问该组件及其每个子组件。

于 2017-07-21T06:52:14.197 回答
-1

只是为了理解。

1-提供者是简单的类,应该是单例的

2-当任何提供者(类)被注入到可注入组件中时,它会要求组件的注入器通过发送该类的密钥来提供注入的类实例

3-如果注入器具有针对该键的单例实例,则返回该实例。

4-否则它创建实例并将该实例注册为单例

一个很好的例子是注入不同服务的 Http 服务

于 2017-07-21T06:55:56.033 回答