Angular 8中这些create service方法之间有什么区别?

问题描述 投票:2回答:1

我是Angular的新手,我有一个问题:

方法1:

@Injectable()

export class classA {
    constructor(
      private service1: Service1,
      private service2: Service2) {
}
}

在应用模块中]

providers: [
 {
      provide: classA ,
      useFactory: authServiceFactory,
      deps: [ RoleService, LogService ]
 }
 ]

export function authServiceFactory(roles: RoleService, log: LogService) {
   const service = new AuthenticationService(roles, log);
   return service;
}

方法2:

@Injectable({
  providedIn: 'root'
})
export class classA{
   constructor(
      private service1: Service1,
      private service2: Service2)
}

@Injectable({
  providedIn: 'root'
})

export class Service1{
}

@Injectable({
  providedIn: 'root'
})

export class Service2{
}

并且app.module中没有提供者。

我想知道这些方法有什么不同。我已经尝试了方法1以及方法2。

我是Angular的新手,我有一个问题:方法1:@Injectable()导出类classA {app.module中的构造方法(私有服务1:服务1,私有服务2:服务2){}}}]] >>

区别在于服务的范围

这会将相同的服务实例注入所有组件。这称为单例:

@Injectable({
  providedIn: 'root'
})
export class MyService {
}

这会将相同的服务实例注入所有组件在该模块中

@NgModule({
  providers: [ MyService ]
})
export class MyModule {}

如果只有一个模块-AppModule-两种方法之间没有区别-它们是等效的。在这种情况下,建议将所有服务声明为providedIn: 'root'

如果有多个模块,则可以声明单例服务,也可以通过在模块providers: []中覆盖它来选择在其中一个模块中提供特定于模块的版本。

举这个例子:

@Injectable({ providedIn: 'root' })
export class MyService {
}

@NgModule({
  declarations: [
    ComponentA,
    ComponentB
  ]
})
export class AppModule { }

@NgModule({
  declarations: [
    FeatureComponentA,
    FeatureComponentB
  ],
  providers: [
    MyService
  ]
})
export class MyFeatureModule { }


@NgModule({
  declarations: [
    OtherComponentA,
    OtherComponentB
  ]
})
export class MyOtherModule { }

ComponentAComponentBOtherComponentAOtherComponentB在注入时都将接收到MyService的相同实例。

[FeatureComponentAFeatureComponentB将收到MyService的第二个实例,因为在声明组件的模块中声明了提供者。

angular dependency-injection service angular8
1个回答
2
投票

区别在于服务的范围

© www.soinside.com 2019 - 2024. All rights reserved.