Angular 将注入的服务引用和可观测值传递给依赖注入之外的普通类

Angular 将注入的服务引用和可观测值传递给依赖注入之外的普通类,angular,dependency-injection,Angular,Dependency Injection,我继承了一个angular项目,其中使用普通javascript对象模拟java风格的实体实例 这就是伪注入的实现方式: export class MyEntity { private http: Http; private someObservable: Observable<any>; init(dependencies, ...) { this.http = dependencies.http; this.someObservable = dep

我继承了一个angular项目,其中使用普通javascript对象模拟java风格的实体实例

这就是伪注入的实现方式:

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... });
  }
}
我的问题是:

  • http会像这样“故障”吗?我担心它可能无法完全工作(CD、拦截器或事件可能无法触发等)。现在它没有显示任何问题,但可能是代码测试不够好

  • 有什么方法可以方便地发布在这里创建的订阅吗?通常,我会在onDestroy钩子中处理这个问题,但对于普通类来说这是不可用的。这里的一些观测是连续的,在第一次发射后不会完成

  • 重构将花费相当长的时间,因此,如果有一个安全的解决方案,即使它相对丑陋,也可能更可取。

    1)在我自己的项目中,我有一个
    serviceheloper
    类,它有
    http:HttpClient
    作为一个参数,从
    @可注入的
    类调用,它工作得很好。简化示例:

    export class ServiceHelperCrl<T> {
      constructor(private http: HttpClient) {
      }
    
      get(id: number): Observable<T> {
        return this.http.get<T>('/some/rest/resource/path'+`/${id}`);
      }
    }
    
    导出类服务helpercrl{
    构造函数(专用http:HttpClient){
    }
    get(id:number):可观察{
    返回这个.http.get('/some/rest/resource/path'+`/${id}`);
    }
    }
    
    2) 我不知道为什么在您的示例中有一个作为参数传递的
    可观察的
    ,或者需要发布哪些订阅

    a) 最终,一个简单的解决方案可能是在Java风格的类中实现定制的
    ondestory()
    方法,并从实现
    ondestory
    的托管类中调用它。 这里有一个退订示例:


    b) 或者您将java样式的类转换为一个
    @Injectable
    类(但可能需要更大的努力)

    最后我这样解决了它,一个静态类,在应用模块初始化期间获取对注入器的引用:

    export class GlobalInjector {
        static injector: Injector;
    }
    
    。。。在app.module中或任何足够快的地方:

    export class AppModule {
      constructor (private injector: Injector) {
        GlobalInjector.injector = injector;
      }
    }
    
    可以像这样在普通类中使用(MyService是一个可注入的服务类):


    对于删除订阅,我还没有找到不需要手动销毁呼叫的好解决方案。

    谢谢!关于2。当某些数据需要在线同步时,它接收来自该可观察对象的发射,然后执行必要的api调用。无论如何,我似乎可以只重构订阅。@不客气!您以何种方式重构订阅?我将它们更改为BehaviorSubjects并仅访问其值。幸运的是,我可以避免触发新排放的代码。
    export class AppModule {
      constructor (private injector: Injector) {
        GlobalInjector.injector = injector;
      }
    }
    
    myDependency = GlobalInjector.injector.get(MyService);