您只能通过引导将服务注入服务吗?

马克·迈耶

我正在尝试连接使用Http服务的基本Angular2应用程序。(我见过的大多数教程都是通过Component使用Http服务来实现的,除非瘦控制器的基本原理发生了变化,否则这似乎是错误的。但这是一个不同的问题。)

我想创建一个使用AngularHttp服务服务。但是我不知道该如何注入Http服务:

boot.ts:

import {bootstrap} from 'angular2/platform/browser';
import {AppComponent} from './app.component';
import {HTTP_PROVIDERS } from 'angular2/http';

bootstrap(AppComponent, [HTTP_PROVIDERS]);

myService.ts:

import {Injectable} from 'angular2/core';
import {Http} from 'angular2/http';

@Injectable()
export class aService{
    constructor(http:Http){
    }
    /** do some stuff *//
}

这行得通,但是要求服务的用户知道服务的依赖项并要求将它们注入引导过程似乎是非常错误的。似乎应该有一种将providers数组直接传递给服务的方法,就像可以使用组件一样,但是我找不到它。我只是想念什么吗?

贡特·佐赫鲍尔(GünterZöchbauer)

更新资料

如果父注入器OtherService为此提供实现,则使用这种方式,否则OtherServiceImpl使用(默认)。

@Injectable()
class SomeService {
  OtherService _other;

  SomeService(Injector injector) {
    _other = injector.getOptional(OtherService);
    if (_other == null) {
      _other = injector.resolveAndCreateChild([
        provide(OtherService, useClass: OtherServiceImpl)
      ]).get(OtherService);
    }
    _other.doSomething();
  }
}

如果您提供另一个像

bootstrap(AppElement, [
  provide(OtherService, useClass: OtherServiceImpl2)
]);

OtherServiceImpl2 用来。

另请参见https://github.com/angular/angular/issues/5622

原版的

您可以使http服务成为可选的(使用@Optional()批注),如果未提供任何服务,只需使用即可在构造函数中创建一个实例new Http()这样,用户无需了解服务依赖关系,但可以在必要时通过其他实现方式(例如,用于测试)。如果在服务内部创建依赖项需要DI本身,则可以注入注入器并使用它来获取依赖项。另请参阅http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html中的可选依赖项

可行的方法(尚未尝试过)只是创建一个子注入器并指示其跳过自身

SkipSelfMetadata文档中

  class Dependency {
  }

  @Injectable()
  class NeedsDependency {
    dependency;
    constructor(@SkipSelf() dependency:Dependency) {
      this.dependency = dependency;
    }
  }

  var parent = Injector.resolveAndCreate([Dependency]);
  var child = parent.resolveAndCreateChild([NeedsDependency]);
  expect(child.get(NeedsDependency).dependency instanceof Depedency).toBe(true);

  var inj = Injector.resolveAndCreate([Dependency, NeedsDependency]);
  expect(() => inj.get(NeedsDependency)).toThrowError();

我还不知道如果父母不能提供所要求的类型,这是否仍能从“自我”中解决。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章