6

我即将使用多提供程序来导出我的依赖项的依赖项及其自身,因此它们可以立即注入到组件中。

对于一个组件

import {Component} from 'angular2/core';
import { FOO_PROVIDERS } from './foo';

@Component({
  selector: 'app',
  providers: [FOO_PROVIDERS]
})
export class App {}

以下_

import {Inject, Injectable, provide} from 'angular2/core';
import {Http, HTTP_PROVIDERS} from 'angular2/http';

export class Foo {
  constructor(@Inject(Http) http) {}
}

export const FOO_PROVIDERS = [
  provide(Foo, { useClass: Foo, multi: true }),
  provide(Foo, { useValue: HTTP_PROVIDERS, multi: true })
];

将导致

没有 Http 提供者!(应用程序-> Foo-> Http)

import {Inject, provide} from 'angular2/core';
import {Http, HTTP_PROVIDERS} from 'angular2/http';

class Foo {
  constructor(@Inject(Http) http) {}
}

export const FOO_PROVIDERS = [Foo, HTTP_PROVIDERS];

会正常工作,而我希望他们能做类似的工作。

在这种情况下,多提供者是否有适当的用途?

4

1 回答 1

5

当您注册时provide(Foo, ...),,您可以

constructor(foo:Foo)

multi: true您一起通过所有注册为Foo

constructor(foo:any)

export const FOO_PROVIDERS = [
  provide(Foo, { useClass: Foo, multi: true }),
  provide(Foo, { useValue: HTTP_PROVIDERS, multi: true })
];

constructor(@Inject(Foo) foo:Foo[])

你会被传递给foo一个数组,其中包含一个实例Foo和一个作为第二项的提供者列表(这些包含在 中HTTP_PROVIDERS

更新

也许你对应该发生的事情有不同的期望。我看不出@Inject(Http) http这里有什么关系。HTTP_PROVIDERS仅注册为 的值FoouseValue当提供者被解析时,你传递给什么值是无关紧要的。DI 查找提供程序Foo并传递分配的值,并且根本不关心该值是什么。您的示例中没有提供者,Http因此Foo本身无法Http注入。您需要注册Http,这在您HTTP_PROVIDERS直接添加到提供者(而不是useValue)时完成,因为HTTP_PROVIDERS包含Http(相当于provide(Http, {useClass: Http})

更新2

// An injected service that itself needs to get passed in a dependency
@Injectable()
class Foo {
  constructor(private http:Http);
}

// container for a bunch of dependencies    
@Injectable()
class MyProviders {
  // add everything you want to make available in your components
  constructor(public foo:Foo, public bar:Bar, ...);
}

class MyComponent {
  // inject just MyProviders and use the dependencies it provides
  constructor(private providers: MyProviders) {
    // access provided values
    providers.foo.doSomething();
    providers.bar.doSomethingElse();
  }
}

// Add all providers to allow DI to resolve all above dependencies
bootstrap(AppComponent, [HTTP_PROVIDERS, Foo, Bar]);

}

于 2016-03-03T17:49:37.733 回答