如何在不使用构造函数 DI 的情况下创建 Http 实例? (RC.5+)

How to create an Http instance WITHOUT using constructor DI? (RC.5+)

我需要在不使用 Angular2 的 DI 的情况下获取 Http 的实例(constructor(private http: Http))

以下代码摘自another Whosebug question,适用于Angular2 RC.4及更早版本,但不适用于RC.5+(HTTP_PROVIDERS不再可用):

const injector = ReflectiveInjector.resolveAndCreate([
  HTTP_PROVIDERS
]);

this.http = injector.get(Http);

Whosebug 上有几个相同代码的不同变体的问题,但是 none 其中的问题适用于 RC.5+。

有人知道如何在 RC.5+ 中执行同样的操作吗?

终于找到答案了。

您可以使用 Injector 获取依赖项,如下所示。

service.ts

import { Injectable,Injector } from '@angular/core';
import {Http} from '@angular/http';

@Injectable()
export class Service{
    constructor(private injector:Injector){}

    display(){

        this.http=this.injector.get(Http);   //<<<<------here the magic happens

        console.log(this.http);
        return this.http.get('user.json').map(res => {return res.json()}).toPromise();
    } 
}


如果您仍然有任何疑问,您可以检查这个在 Angular2.0.0 中制作的工作插件:
https://plnkr.co/edit/eWLB2BaL66pnJ7SC6qAL?p=preview

只需查看 HttpModule 的来源即可。您将看到创建 Http 所需的所有提供程序。这些提供程序中的大多数是现已删除的 HTTP_PROVIDERS

export function _createDefaultCookieXSRFStrategy() {
  return new CookieXSRFStrategy();
}

export function httpFactory(xhrBackend: XHRBackend, requestOptions: RequestOptions): Http {
  return new Http(xhrBackend, requestOptions);
}

@NgModule({
  providers: [
    {provide: Http, useFactory: httpFactory, deps: [XHRBackend, RequestOptions]},
    BrowserXhr,
    {provide: RequestOptions, useClass: BaseRequestOptions},
    {provide: ResponseOptions, useClass: BaseResponseOptions},
    XHRBackend,
    {provide: XSRFStrategy, useFactory: _createDefaultCookieXSRFStrategy},
  ],
})
export class HttpModule {
}

只需将上面 providers 中的所有内容添加到您传递给 ReflectiveInjector.resolveAndCreate 的数组中即可。

如果您的目标是在 bootstrap 之前获得 Http,那么您还需要注意另一件小事,即 CookieXSRFStrategy。它在 bootstrapping 之前不起作用,因为它依赖于某些平台浏览器的东西。您可以将其替换为 noop,如

中所述