你能通过bootstrap将服务注入服务吗?

时间:2016-01-03 21:02:12

标签: dependency-injection angular

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

我想创建一个使用Angular的Http服务的服务。但我无法弄清楚如何注入除此之外的Http服务:

boot.ts:

Http

myService.ts:

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

bootstrap(AppComponent, [HTTP_PROVIDERS]);

这是有效的,但要求服务的用户知道服务的依赖性并且需要将它们注入到引导过程中似乎是非常错误的。似乎应该有一种方法可以将import {Injectable} from 'angular2/core'; import {Http} from 'angular2/http'; @Injectable() export class aService{ constructor(http:Http){ } /** do some stuff *// } 数组直接传递给服务,就像组件一样,但我找不到它。我只是错过了一些东西吗?

1 个答案:

答案 0 :(得分:3)

<强>更新

这样,如果父注入器为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();

我还不知道这是否仍然来自&#34; self&#34;如果父母不能提供所要求的类型。