【问题标题】:Angular - inject in other way than constructor?Angular - 以构造函数以外的其他方式注入?
【发布时间】:2017-07-21 19:31:58
【问题描述】:

在 Angular 中,我有一个通过 constructor(...) 注入的东西很少的服务。但是,该服务也位于通过调用构造函数创建的某个位置。因此,将它依赖的另一个服务添加到参数将更改 API。我想避免这种情况。

有没有办法将一个服务注入另一个服务而不将其添加到构造函数参数中?例如。现场注入?

import {Inject, Injectable} from "@angular/core";
import {
    Http, Request, ConnectionBackend, RequestOptions, RequestOptionsArgs, Response, Headers,
    RequestMethod
} from "@angular/http";

import {KeycloakService} from "./keycloak.service";
import {Observable} from 'rxjs/Observable';
import {EventBusService} from "../events/event-bus.service";
import {LoadingSomethingFinishedEvent, LoadingSomethingStartedEvent} from "../events/windup-event";

@Injectable()
export class WindupHttpService extends Http {
    constructor(
        _backend: ConnectionBackend,
        _defaultOptions: RequestOptions,
        private _keycloakService: KeycloakService,
        // ----- This is what I want to avoid. -----
        private _eventBus: EventBusService,
    ) {
        super(_backend, _defaultOptions);
    }

    // -------  This is what I am looking for ---------
    //@Inject()
    //private _eventBus: EventBusService;

【问题讨论】:

  • 根据您的更新,简短的回答是:不,Angular 的 DI 仅原生支持构造函数注入。

标签: angular typescript angular2-services angular-services


【解决方案1】:

是和不是。

您可以使用Injector,但最好的方法是将其注入到服务中:

constructor(private injector: Injector) {
        let httpService: Http = this.injector.get(Http);
}

更多关于 Injector 的信息可以在这里找到: https://angular.io/api/core/Injector

这里也是可用的链接,正如@DBosley 提到的:https://angular.io/guide/dependency-injection#appendix-working-with-injectors-directly

【讨论】:

【解决方案2】:

您可以使用 factory providers 在 Angular 的 DI 中执行此操作:

injectFields(dependency: SomeDependency) {
  let service = new FieldInjectedService();
  service.dependency = dependency;
  return service;
}

...

providers: [
  { provide: FieldInjectedService, useFactory: injectFields, deps: [SomeDependency] },
  ...
]

这里FieldInjectedService 没有任何构造函数参数,但必须将其dependency 属性设置为任何用途。当然,缺点是这里没有要求您设置这些字段,因此您可以轻松创建无效的服务实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多