В чем разница между этим методом создания сервиса в Angular 8? - PullRequest
2 голосов
/ 20 марта 2020

Я новичок в Angular, у меня вопрос:

Method1:

@Injectable()

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

в app.module

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

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

Method2:

@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.

1 Ответ

2 голосов
/ 20 марта 2020

Разница заключается в определении объема службы.

. При этом один и тот же экземпляр службы внедряется во все компоненты. Это называется синглтоном:

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

Это приведет к тому, что один и тот же экземпляр службы будет добавлен во все компоненты в этом модуле :

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

Если вы только есть один модуль - AppModule - нет разницы между двумя подходами - они эквивалентны. В этом сценарии рекомендуется объявить все службы как * 1012. *

Если у вас есть несколько модулей, вы можете объявить одноэлементную службу, а также указать указанную версию модуля c в одном из ваши модули, переопределив его в модуле 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 { }

ComponentA, ComponentB, OtherComponentA, OtherComponentB все получат тот же экземпляр MyService при его внедрении.

FeatureComponentA и FeatureComponentB получат второй экземпляр MyService, поскольку в модуле объявлен поставщик, в котором объявлены компоненты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...