서비스를 클래스에 주입하는 방법(구성 요소가 아님)
구성요소가 아닌 클래스에 서비스를 주입하고 싶습니다.
예:
나의 서비스
import {Injectable} from '@angular/core';
@Injectable()
export class myService {
dosomething() {
// implementation
}
}
나의 수업
import { myService } from './myService'
export class MyClass {
constructor(private myservice:myService) {
}
test() {
this.myservice.dosomething();
}
}
시도해 봤는데 잘 안 돼요.서비스는 구성 요소나 서비스에서만 사용해야 할 것 같습니다.
정상적인 수업에서 서비스를 이용할 수 있는 방법이 있습니까?아니면 정상적인 수업에서 서비스를 사용하는 것은 나쁜 관행입니다.
감사해요.
주입은 DI(Angulars Dependency Injection)로 인스턴스화되는 클래스에서만 작동합니다.
- 당신은 해야 합니다.
- 더하다
@Injectable()
로.MyClass
그리고. - 제공하다
MyClass
맘에 들다providers: [MyClass]
구성 요소 또는 NgModule에 있습니다.
당신이 주사를 놓을 때MyClass
어딘가에, aMyService
인스턴스가 에 전달됩니다.MyClass
DI에 의해 인스턴스화되는 경우(처음 주입되기 전).
- 대안적인 접근 방식은 다음과 같은 사용자 정의 인젝터를 구성하는 것입니다.
새 정적 인젝터 사용
constructor(private injector:Injector) {
let childInjector = Injector.create({ providers: [MyClass], parent: this.injector});
let myClass : MyClass = childInjector.get(MyClass);
}
사용되지 않는 리플렉티브 사용인젝터
constructor(private injector:Injector) {
let resolvedProviders = ReflectiveInjector.resolve([MyClass]);
let childInjector = ReflectiveInjector.fromResolvedProviders(resolvedProviders, this.injector);
let myClass : MyClass = childInjector.get(MyClass);
}
이쪽입니다.myClass
가 될 것입니다MyClass
인스턴스, Angulars DI에 의해 인스턴스화됨,myService
에 주입될 것입니다.MyClass
예를 들면,
참고 항목지시 내에서 인젝터에서 수동으로 종속성 가져오기
- 다른 방법은 직접 인스턴스를 만드는 것입니다.
constructor(ms:myService)
let myClass = new MyClass(ms);
질문에 대한 직접적인 대답은 아니지만, 만약 당신이 이 SO를 읽고 있다면, 나는 이것이 도움이 될 것입니다.
예를 들어 ng2-translate를 사용하고 있으며 정말로 가정해 보겠습니다.User.ts
그것을 가질 수 있는 계급.당신은 DI를 사용하여 그것을 넣는 것이라고 즉시 생각합니다, 결국 당신은 Angular를 하고 있습니다.하지만 그것은 다소 지나친 생각입니다. 생성자에게 전달하거나 구성 요소에서 설정한 공개 변수로 만들 수 있습니다(DI를 수행한 것으로 추정됨).
예:
import { TranslateService } from "ng2-translate";
export class User {
public translateService: TranslateService; // will set from components.
// a bunch of awesome User methods
}
번역 서비스를 주입한 일부 사용자 관련 구성 요소에서.
addEmptyUser() {
let emptyUser = new User("", "");
emptyUser.translateService = this.translateService;
this.users.push(emptyUser);
}
이것이 저처럼 코드를 유지하기 위해 더 많은 것을 쓰려고 했던 사람들에게 도움이 되었으면 좋겠습니다. 왜냐하면 우리는 때때로 너무 영리하기 때문입니다. =]
(참고: 변수를 생성자 방법의 일부로 만드는 대신 변수를 설정하려는 이유는 서비스를 사용할 필요가 없는 경우가 있을 수 있으므로 항상 전달해야 한다는 것은 실제로 사용되지 않는 추가 가져오기/코드를 도입하는 것을 의미합니다.)
이것은 좀 (매우) 진부하지만, 저도 제 솔루션을 공유하고 싶습니다.Singleton 서비스(구성 요소가 아닌 앱 루트에 삽입됨)는 애플리케이션만큼 오래 사용할 수 있고 인스턴스가 하나뿐이므로 이 서비스는 Singleton 서비스(구성 요소가 아닌 앱 루트에 삽입됨)에서만 작동합니다.
첫 번째로, 당신의 서비스에서:
@Injectable()
export class MyService {
static instance: MyService;
constructor() {
MyService.instance = this;
}
doSomething() {
console.log("something!");
}
}
그러면 모든 클래스에서:
export class MyClass {
constructor() {
MyService.instance.doSomething();
}
}
이 솔루션은 코드 혼란을 줄이고 비싱글톤 서비스를 사용하지 않는 경우에 유용합니다.
로케이터service.ts
import {Injector} from "@angular/core";
export class ServiceLocator {
static injector: Injector;
}
app.s.ts.
@NgModule({ ... })
export class AppModule {
constructor(private injector: Injector) {
ServiceLocator.injector = injector;
}
}
돈.모델.ts.
export class Poney {
id: number;
name: string;
color: 'black' | 'white' | 'brown';
service: PoneyService = ServiceLocator.injector.get(PoneyService); // <--- HERE !!!
// PoneyService is @injectable and registered in app.module.ts
}
서비스 방법이 순수한 기능인 경우 이 문제를 해결할 수 있는 깨끗한 방법은 서비스에 정적 멤버를 두는 것입니다.
당신의 서비스
import {Injectable} from '@angular/core';
@Injectable()
export class myService{
public static dosomething(){
//implementation => doesn't use `this`
}
}
당신의 학급
export class MyClass{
test(){
MyService.dosomething(); //no need to inject in constructor
}
}
는 Angular 14이므로 Angular 14를 할 수 .inject
기능. .그러나 그것은 생성자에서만 호출되어야 합니다.
import { myService } from './myService'
export class MyClass {
private myservice: myService
constructor() {
this.myservice = inject(myService);
}
test() {
this.myservice.dosomething();
}
}
다른 곳에
import { MyClass } from './myClass'
@component()
export class MyComponent {
constructor() {
const myClass = new MyClass();
}
}
언급URL : https://stackoverflow.com/questions/41432388/how-to-inject-service-into-class-not-component
'programing' 카테고리의 다른 글
twitter 부트스트랩 자동 검색 Ajax 예제 (0) | 2023.05.09 |
---|---|
과거의 Git 커밋을 어떻게 만들 수 있습니까? (0) | 2023.05.09 |
bash 스크립트에서 source를 사용할 때 'source: not found' 오류가 발생함 (0) | 2023.05.09 |
AzureStorageBLOB Server가 요청을 인증하지 못했습니다.서명을 포함하여 Authorization 헤더 값이 올바르게 형성되었는지 확인합니다. (0) | 2023.05.09 |
만방법드는의 첫 을 만드는 만방법드는의 첫 을 만드는 만방법드는의 첫 을 만드는 (0) | 2023.05.09 |