将注入的服务引用和可观察量传递给依赖关系注入之外的普通类



我继承了一个角度项目,其中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、拦截器或事件可能无法触发等(。现在它没有显示任何问题,但可能是代码测试得不够好。

  2. 有什么方法可以方便地发布在这里创建的订阅吗?通常我会在 onDestroy 钩子中处理这个问题,但这不适用于普通类。这里的一些可观察量是连续的,在首次发出后不会完成。

重构需要相当长的时间,所以如果有一个安全的解决方案,即使它相对丑陋,也可能更可取。

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( 归根结底,一个简单的解决方案可能是在该 Java 样式类中实现您的自定义onDestroy()方法,并从实现OnDestroy的托管类中调用它。 这里有一个退订示例:Angular/RxJs 我什么时候应该退订"订阅"。

b(或者你将Java风格的类转换为@Injectable类(但也许工作量更大(

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

export class GlobalInjector {
static injector: Injector;
}

。在 app.module 或任何很快的地方:

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

可以在普通类中像这样使用(MyService是一个可注入的服务类(:

myDependency = GlobalInjector.injector.get(MyService);

为了删除订阅,我发现还没有不需要手动销毁调用的好解决方案。

最新更新