Heredé un proyecto angular donde las instancias de entidad de estilo java se imitan usando objetos javascript simples.

Así es como se implementa la inyección falsa:

export class MyEntity {

  private http: Http;
  private someObservable: Observable<any>;

  init(dependencies, ...) {
    this.http = dependencies.http;
    this.someObservable = dependencies.someObservable;

    this.someObservable.subscribe((res) => { ...unimportant logic... });
  }
}

Luego en el código DI habilitado:

entity = new MyEntity();
entity.init({ http: this.http, someObservable: this.someObservable, ... }, ...);

Mis preguntas:

  1. ¿Puede http "mal funcionamiento" como este? Me preocupa que no funcione completamente (CD, interceptores o eventos podrían no activarse, etc.). En este momento no muestra ningún problema, pero podría ser que el código no se haya probado lo suficientemente bien.

  2. ¿Hay alguna forma de liberar suscripciones creadas aquí convenientemente? Normalmente me ocuparía de eso en un gancho onDestroy, pero eso no está disponible para clases simples. Algunos de los observables aquí son continuos, no se completarán después de la primera emisión.

Refactorizar llevaría bastante tiempo, por lo que si hay una solución segura que podría ser preferible incluso si es relativamente fea.

0
bitwise 13 feb. 2020 a las 16:59

2 respuestas

La mejor respuesta

Finalmente lo resolví así, una clase estática que obtiene una referencia al Inyector durante el inicio del módulo de la aplicación:

export class GlobalInjector {
    static injector: Injector;
}

... y en app.module o donde sea pronto:

export class AppModule {
  constructor (private injector: Injector) {
    GlobalInjector.injector = injector;
  }
}

Se puede usar así en una clase simple (MyService es una clase de servicio inyectable):

myDependency = GlobalInjector.injector.get(MyService);

Para eliminar la suscripción, no encontré una buena solución que no necesite llamadas de destrucción manual.

0
bitwise 17 abr. 2020 a las 12:29

1) En mi propio proyecto tengo una clase ServiceHelper que tiene http : HttpClient como argumento que se invoca desde una clase @Injectable y funciona perfectamente. Ejemplo simplificado:

export class ServiceHelperCrl<T> {
  constructor(private http: HttpClient) {
  }

  get(id: number): Observable<T> {
    return this.http.get<T>('/some/rest/resource/path'+`/${id}`);
  }
}

2) No sé por qué hay un Observable pasado como argumento en su ejemplo o qué suscripciones necesitan ser lanzadas.

A) Al final del día, una solución simple podría ser implementar su método personalizado onDestroy() en esa clase de estilo Java e invocarlo desde su clase administrada que implementa OnDestroy. Aquí hay un ejemplo de cancelación de suscripción: Angular / RxJs ¿Cuándo debo darme de baja de ` Suscripción`.

B) o convierte su clase de estilo java a una clase @Injectable (pero tal vez ese esfuerzo sea mayor)

1
michaeak 13 feb. 2020 a las 15:39