Передача внедренных сервисных ссылок и наблюдаемых в простой класс вне внедрения зависимостей - PullRequest
0 голосов
/ 13 февраля 2020

Я унаследовал проект angular, в котором экземпляры сущностей в стиле java имитируются с использованием простых javascript объектов.

Вот как реализована ложная инъекция:

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... });
  }
}

тогда в DI включили код:

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

Мои вопросы:

  1. Может ли http "неисправность" вот так? Я беспокоюсь, что он может работать не полностью (CD, перехватчики или события могут не сработать. Et c). Прямо сейчас это не показывает никаких проблем, но, возможно, код просто недостаточно хорошо протестирован.

  2. Есть ли какой-нибудь способ для удобного выпуска созданных здесь подписок? Обычно я бы позаботился об этом в хуке onDestroy, но это не доступно для простых классов. Некоторые из наблюдаемых здесь непрерывны, не завершатся после первого выброса.

Рефакторинг займет довольно много времени, поэтому, если есть безопасное решение, которое может быть предпочтительным, даже если оно относительно некрасиво.

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

1) В моем собственном проекте у меня есть класс ServiceHelper, который имеет http : HttpClient в качестве аргумента, который вызывается из класса @Injectable, и он отлично работает. Упрощенный пример:

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

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

2) Я не знаю, почему в вашем примере в качестве аргумента передается Observable или какие подписки необходимо освободить.

a) В конце дня простым решением может стать реализация вашего пользовательского метода onDestroy() в этом Java -Style-классе и вызов его из вашего управляемого класса, который реализует OnDestroy. Вот пример отказа от подписки: Angular / Rx Js Когда мне следует отписаться от `Subscription` .

b) или вы конвертируете свой java -style-class в @Injectable класс (но, может быть, это усилие больше)

0 голосов
/ 17 апреля 2020

Наконец, я решил это следующим образом: класс c, который получает ссылку на Инжектор во время инициализации модуля приложения:

export class GlobalInjector {
    static injector: Injector;
}

... и в app.module или где угодно, достаточно скоро. :

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

может использоваться следующим образом в простом классе (MyService - это инъекционный класс обслуживания):

myDependency = GlobalInjector.injector.get(MyService);

Для удаления подписки я не нашел еще хорошего решения, которое не не нужно вручную уничтожать вызовы.

...