Angular 2多供应商用于导出依赖关系的依赖关系
我即将使用multi-provider来导出依赖关系与其自身的依赖关系,因此它们可以一次注入到组件中。Angular 2多供应商用于导出依赖关系的依赖关系
对于分量
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! (应用程序 - >富 - > HTTP)
而且this
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];
将正常工作,而我希望他们做类似的工作。
在这种情况下是否有适当的多供应商使用?
当您注册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
实例和为第12项供应商(这些包含在HTTP_PROVIDERS
)
也许你有不同的期望列表
更新数组应该发生什么。我不知道@Inject(Http) http
在这里是如何相关的。 HTTP_PROVIDERS
仅注册为Foo
的值。提供商解决问题时,您传递给useValue
的价值无关紧要。 DI查找供应商Foo
并通过了指定的值,并且完全不关心该值是什么。在您的示例中没有Http
的提供者,因此Foo
本身无法获得Http
注入。您需要注册Http
,这是当你直接添加HTTP_PROVIDERS
到供应商(不useValue
)来完成,因为HTTP_PROVIDERS
包含Http
(这相当于provide(Http, {useClass: Http})
UPDATE2
// 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]);
}
可悲的是,我无法验证这一点。 [This](http://plnkr.co/edit/XyBBUNb6smvq3ieH4fp1?p=preview)和[this](http://plnkr.co/edit/nerxCcdwoju6MBplPXhI?p=preview)将导致注入Foo实例(使用'构造函数(@Inject(Foo)foo)'),唯一的区别是Http在多提供程序的情况下无法解析。做'constructor(foo:Foo [])'会抛出'没有Array的提供者! (应用程序 - >数组)'。 – estus
如果您将'FOO_PROVIDERS'添加到'App's提供程序而不是'Foo',这可以在您的第一个Plunker中正常工作http://plnkr.co/edit/mxet3Knfirnsf2jA0XGu?p=preview –
事实上,它没有,请注意'@Inject(Http)http'被故意注释以确保注入的'foo'不是一个数组,而是Foo实例。使用未注释的依赖关系(问题中的[第一个示例](http://plnkr.co/edit/rNRalQnnkAPcTItmguW3?p=preview))问题与描述的相同。所以目前还不清楚多供应商在这里的使用有什么问题,以及答案如何适用于这种情况。 – estus
作为一个说明:我有一个挂断 - 确保在定义类FOO之后放置FOO_PROVIDERS,而不是在 – Tucker
@Tucker之前放置这是正确的,类不会被挂起 – estus