我正在编写一个 Angular2 应用程序。考虑一个 Cat 类,我实例化了它的许多实例,它有一个 API 方法可以将自身写出:
class Cat {
constructor(private name: string) { }
public write() {
Api.write(this); // <== how do I do this?
}
}
Cat#write
方法需要访问围绕 Http
封装的 API 服务:
@Injectable()
class Api {
constructor(private http: Http) { }
write(data) {
this.http.post(...);
}
}
我遇到的(也许很简单)问题是如何从我的 Cat
类中访问 API#write
。由于我需要 Cat 构造函数来传入名称,因此我无法使用它进行注入(inject)。那么如何让 API#write
可供它使用呢?有没有办法访问Api
的单例实例?那么,谁来负责实例化单例实例呢?
我尝试过使用静态 API 类,但这显然行不通,因为注入(inject)是注入(inject)到实例中,而不是静态类中。
我在这里缺少什么基本设计模式?
最佳答案
我也为此苦苦挣扎了一段时间。我确实想出了一种解决方案,但感觉很糟糕。
我使用单例AppInjector
实例。它仅在 AppComponent(引导组件)的构造函数中设置一次。它用于解决要创建的对象的依赖关系。
这个 AppInjector 看起来像这样:
export class AppInjector {
private static _INJECTOR: Injector;
public static set INSTANCE(injector: Injector) {
if (!this._INJECTOR) {
this._INJECTOR = injector;
}
}
public static get INSTANCE() : Injector {
return this._INJECTOR;
}
}
AppComponent
的构造函数如下所示:
constructor(injector: Injector) {
AppInjector.INSTANCE = injector;
}
现在,如果您已在应用程序的 bootstrap
函数中添加了 Api
:
bootstrap(AppComponent, [Api]);
您将能够从 Cat
实例中获取此单例,如下所示:
class Cat {
public get _api() : Api {
return AppInjector.INSTANCE.get(Api);
}
constructor(private name: string) { }
public write() {
this._api.write(this);
}
}
再说一遍,这绝不是正确的解决方案,并且可能违反了 Angular2 中的许多准则,但我理解你的问题,并且也想要一个比这更好的解决方案,但它现在工作得很好,因为它是,我可以愉快地继续编码
关于dependency-injection - 从类实例调用注入(inject)的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38242689/