[angular] Angular 6에서 서비스를 생성 할 때 Injectable 데코레이터와 함께 제공되는 목적은 무엇입니까?

Angular CLI에서 서비스를 생성 할 때 인젝터 블 데코레이터의 기본 값이 ‘root’인 ‘provided in’특성을 가진 메타 데이터가 추가됩니다.

@Injectable({
  providedIn: 'root',
})

정확히 무엇을 제공합니까? 이것이 전체 응용 프로그램에 대해 ‘전역’유형의 싱글 톤 서비스처럼 서비스를 제공한다고 가정하고 있지만 AppModule의 공급자 배열에서 이러한 서비스를 선언하는 것이 더 깨끗하지 않습니까?

최신 정보:

다른 사람을 위해, 다음 단락은 특히 기능 모듈에만 서비스를 제공하려는 경우 이에 대한 또 다른 좋은 설명을 제공했습니다.

이제 @Injectable()providedIn
속성을 사용하여 데코레이터 내부에 공급자를 등록하는 새로운 권장 방법이 있습니다. 'root'응용 프로그램의 값 또는 모듈로 허용 됩니다. 당신이 사용하는 경우 'root', 당신은 injectable응용 프로그램에서 싱글로 등록됩니다, 당신은 루트 모듈의 공급 업체에 추가 할 필요가 없습니다. 당신이 사용하는 경우 마찬가지로,
providedIn: UsersModule의는 injectable의 공급자로 등록되어 UsersModule받는 사람을 추가하지 않고 providers모듈의 “-.
https://blog.ninja-squad.com/2018/05/04/what-is-new-angular -6 /

업데이트 2 :

추가 조사 후, 나는 그것을 가지고있는 것이 유용하다고 결정했습니다 providedIn: 'root'

provide루트 모듈 이외의 다른 모듈에서 서비스 를 원한다면 providers피처 모듈 데코레이터에서 배열을 사용하는 것이 좋습니다 . 그렇지 않으면 순환 종속성에 시달립니다. 흥미로운 토론이 여기에 있습니다-https: //github.com/angular/angular-cli/issues/10170



답변

providedIn을 사용하는 경우, 인젝터 블은 모듈의 제공자에 추가하지 않고 모듈의 제공자로 등록됩니다.

에서 Docs

서비스 자체는 CLI가 생성하고 @Injectable로 장식 된 클래스입니다. 기본적으로이 데코레이터는 providedIn 속성으로 구성되어 서비스 공급자를 만듭니다. 이 경우 providedIn : ‘root’는 서비스가 루트 인젝터에 제공되도록 지정합니다.


답변

providedIn: 'root' Angular 6 이후로 서비스를 제공하는 가장 쉽고 효율적인 방법입니다.

  1. 이 서비스는 모듈의 공급자 배열 (예 : Angular <= 5)에 추가 할 필요없이 단일 응용 프로그램에서 단일 응용 프로그램으로 사용할 수 있습니다.
  2. 서비스가 지연로드 된 모듈 내에서만 사용되는 경우 해당 모듈과 함께 지연로드됩니다.
  3. 사용하지 않으면 빌드에 포함되지 않습니다 (트리 흔들림).

자세한 내용은 설명서NgModule FAQ를 참조하십시오.

Btw :

  1. 응용 프로그램 전체의 싱글 톤을 원하지 않으면 공급자의 구성 요소 배열을 대신 사용하십시오.
  2. 다른 개발자가 특정 모듈 외부에서 서비스를 사용하지 않도록 범위를 제한하려면 providers대신 NgModule 배열을 사용하십시오 .

답변

문서에서

주사 가능한 데코레이터 란 무엇입니까?

클래스를 인젝터에서 사용할 수있는 것으로 표시합니다.

import { Injectable } from '@angular/core';

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

서비스 자체는 CLI가 생성 한 클래스이며 @Injectable ()로 장식되어 있습니다.

정확히 무엇을 제공합니까?

@NgModule 또는 다른 InjectorType과 연관 시키거나이 인젝터를 ‘루트’인젝터에 제공하도록 지정하여 인젝터를 제공 할 인젝터를 판별하십시오. 이는 대부분의 앱에서 애플리케이션 레벨 인젝터입니다.

providedIn: Type<any> | 'root' | null

제공 : ‘루트’

루트 수준에서 서비스를 제공하면 Angular는 하나의 공유 서비스 인스턴스를 생성하여이를 요청하는 모든 클래스에 주입합니다. 제공자를 @Injectable () 메타 데이터에 등록하면 Angular는 컴파일 된 앱에서 서비스를 사용하지 않는 경우 서비스를 제거하여 앱을 최적화 할 수 있습니다.

제공 : 모듈

특정 @NgModule에서 서비스를 제공하도록 지정할 수도 있습니다. 예를 들어, 생성 한 모듈을 가져 오지 않으면 응용 프로그램에서 서비스를 사용할 수 없게하려면 서비스를 모듈에 제공하도록 지정할 수 있습니다

import { Injectable } from '@angular/core';
import { UserModule } from './user.module';

@Injectable({
  providedIn: UserModule,
})
export class UserService {
}

이 방법은 아무 것도 주입하지 않으면 서비스의 트리 쉐이킹 ( 트리 쉐이킹 은 코드 기반에서 사용되지 않는 코드를 제거하는 빌드 프로세스의 단계)을 가능하게하기 때문에 선호 됩니다.

어떤 모듈이 어떤 모듈을 제공해야하는지 서비스에서 지정할 수없는 경우, 모듈 내에서 서비스 제공자를 선언 할 수도 있습니다.

import { NgModule } from '@angular/core';
import { UserService } from './user.service';

@NgModule({
  providers: [UserService],
})
export class UserModule {
}


답변

providedIn은 루트 인젝터가 서비스 인스턴스 작성을 담당 함을 Angular에 알려줍니다. 이러한 방식으로 제공되는 서비스는 전체 응용 프로그램에서 자동으로 사용할 수 있으며 모듈에 나열 할 필요가 없습니다.

서비스 클래스는 자체 공급자로 작동 할 수 있으므로 @Injectable 데코레이터에서이를 정의하는 것이 필요한 모든 등록 이유입니다.


답변

에 따르면 Documentation:

제공자를 @Injectable () 메타 데이터에 등록하면 Angular는 컴파일 된 앱에서 서비스를 사용하지 않는 경우 서비스를 제거하여 앱을 최적화 할 수 있습니다.


답변