dependency-injection - 从类实例调用注入(inject)的服务

标签 dependency-injection angular

我正在编写一个 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/

相关文章:

html - 使用 Angular2 以编程方式创建 Html 局部变量

javascript - textarea resize 在 IE 中不起作用,我想在 IE 中调整大小,它在 chrome 中工作

Angular - 如果已将不必要的 ngModules 导入别处,导入它们是否会增加文件大小?

spring - 使用@Value Spring Annotation 从.yaml 读取的属性映射的正确用法是什么

dependency-injection - 使用 @Resource 通过 Java EE 6 和 Glassfish 3.1 注入(inject)资源时遇到问题

java - 使用 Guice 注入(inject)通用接口(interface)子类型的实现

c# - 手动实例化和调用 TagHelpers

javascript - 如何为我的 ng2-charts 条形图添加标题

javascript - TypeScript async wait 似乎并不总是等待 ("block and come back")

java - 复合体上的依赖注入(inject)(E4、RCP、SWT)