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 {} 

following

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]; 

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

在这种情况下是否有适当的多供应商使用?

+0

作为一个说明:我有一个挂断 - 确保在定义类FOO之后放置FOO_PROVIDERS,而不是在 – Tucker

+0

@Tucker之前放置这是正确的,类不会被挂起 – estus

当您注册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]); 

}

+0

可悲的是,我无法验证这一点。 [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

+0

如果您将'FOO_PROVIDERS'添加到'App's提供程序而不是'Foo',这可以在您的第一个Plunker中正常工作http://plnkr.co/edit/mxet3Knfirnsf2jA0XGu?p=preview –

+0

事实上,它没有,请注意'@Inject(Http)http'被故意注释以确保注入的'foo'不是一个数组,而是Foo实例。使用未注释的依赖关系(问题中的[第一个示例](http://plnkr.co/edit/rNRalQnnkAPcTItmguW3?p=preview))问题与描述的相同。所以目前还不清楚多供应商在这里的使用有什么问题,以及答案如何适用于这种情况。 – estus