programing

서비스를 클래스에 주입하는 방법(구성 요소가 아님)

oldcodes 2023. 5. 9. 22:59
반응형

서비스를 클래스에 주입하는 방법(구성 요소가 아님)

구성요소가 아닌 클래스에 서비스를 주입하고 싶습니다.

예:

나의 서비스

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)로 인스턴스화되는 클래스에서만 작동합니다.

  1. 당신은 해야 합니다.
  • 더하다@Injectable()로.MyClass그리고.
  • 제공하다MyClass맘에 들다providers: [MyClass]구성 요소 또는 NgModule에 있습니다.

당신이 주사를 놓을 때MyClass어딘가에, aMyService인스턴스가 에 전달됩니다.MyClassDI에 의해 인스턴스화되는 경우(처음 주입되기 전).

  1. 대안적인 접근 방식은 다음과 같은 사용자 정의 인젝터를 구성하는 것입니다.

새 정적 인젝터 사용

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예를 들면,
참고 항목지시 내에서 인젝터에서 수동으로 종속성 가져오기

  1. 다른 방법은 직접 인스턴스를 만드는 것입니다.
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

반응형