생성자 주입없이 서비스 인스턴스 얻기
@Injectable
부트 스트랩에 정의 된 서비스 가 있습니다 . 생성자 주입을 사용하지 않고 서비스의 인스턴스를 얻고 싶습니다. 나는 사용해 ReflectiveInjector.resolveAndCreate
보았지만 새 인스턴스를 만드는 것 같습니다.
내가하려는 이유는 많은 구성 요소에서 파생 된 기본 구성 요소가 있기 때문입니다. 이제 서비스에 액세스해야하지만 모든 파생 구성 요소에 서비스를 삽입하고 싶지 않기 때문에 ctor에 추가하고 싶지 않습니다.
TLDR : 나는 ServiceLocator.GetInstance<T>()
업데이트 : RC5 +에 대한 업데이트 된 코드 : 구성 요소에 사용할 인젝터 인스턴스 저장
예, ReflectiveInjector.resolveAndCreate()
연결되지 않은 새 인젝터 인스턴스를 생성합니다.
Angulars Injector
인스턴스 를 삽입 하고 다음을 사용하여 원하는 인스턴스를 가져올 수 있습니다.
constructor(private injector:Injector) {
injector.get(MyService);
}
또한 Injector
일부 전역 변수에 를 저장할 수 있으며이 인젝터 인스턴스를 사용하여 예를 들어 https://github.com/angular/angular/issues/4112#issuecomment-153811572에 설명 된 것처럼 제공된 인스턴스를 획득 할 수 있습니다.
ngModules가 사용되는 업데이트 된 Angular에서 코드 어디에서나 사용할 수있는 변수를 만들 수 있습니다.
export let AppInjector: Injector;
export class AppModule {
constructor(private injector: Injector) {
AppInjector = this.injector;
}
}
또 다른 접근 방식은 사용자 지정 데코레이터 ( CustomInjectable
종속성 주입을위한 메타 데이터 설정) 를 정의하는 것입니다 .
export function CustomComponent(annotation: any) {
return function (target: Function) {
// DI configuration
var parentTarget = Object.getPrototypeOf(target.prototype).constructor;
var parentAnnotations = Reflect.getMetadata('design:paramtypes', parentTarget);
Reflect.defineMetadata('design:paramtypes', parentAnnotations, target);
// Component annotations / metadata
var annotations = Reflect.getOwnMetadata('annotations', target);
annotations = annotations || [];
annotations.push(annotation);
Reflect.defineMetadata('annotations', annotations, target);
}
}
자체 생성자 대신 부모 생성자의 메타 데이터를 활용합니다. 하위 클래스에서 사용할 수 있습니다.
@Injectable()
export class SomeService {
constructor(protected http:Http) {
}
}
@Component()
export class BaseComponent {
constructor(private service:SomeService) {
}
}
@CustomComponent({
(...)
})
export class TestComponent extends BaseComponent {
constructor() {
super(arguments);
}
test() {
console.log('http = '+this.http);
}
}
자세한 내용은이 질문을 참조하십시오.
'IT story' 카테고리의 다른 글
추가하는 대신 Python 교체 및 덮어 쓰기 (0) | 2020.12.25 |
---|---|
CSS가있는 반원 (테두리, 윤곽선 만) (0) | 2020.12.25 |
클래스에는 몇 개의 생성자가 있습니까? (0) | 2020.12.25 |
Android의 Moshi 대 Gson (0) | 2020.12.25 |
'bool'은 C ++의 기본 데이터 유형입니까? (0) | 2020.12.25 |