2016-12-18 3 views
1

私はNG2メタデータなどを持たないクラスUserを持っていますが、"@angular/http"からHttpにアクセスしたいと思います。 Httpにアクセスできるように、このクラスをNG DIプロバイダ/インジェクタシステムに導入する最良の方法は何ですか?Plain Ol 'TypeScriptクラスからアクセスする@ angular/http Httpクライアント

私は、次のようなもののために行くよ:

import {Http, Response} from "@angular/http" 

export class User { 
    constructor(private _email:string){} 

    public reload(){ 
    this.http.get("http://www.example.com") 
     .subscribe(...) 
    } 
} 
+0

このデザインを再考する必要があるようです。私たちがもっと文脈を持っていないので、それを助けるのは難しいです。このクラスをどこで使っているのですか?それはどこから呼び出されますか。あなたはもっと完全な絵を描くいくつかの例を見せてもらえますか? –

+0

@peeskillet、SessionServiceでユーザーを表すことができるUserクラスが必要です。基礎となるデータ変更のためにDBにpingを実行する 'reload()'関数を公開することに責任があります。私は 'UserService'を使って別のルートを試してみたいと思います。 –

答えて

3

私はこれは良いアイデアだと思いますが、とにかく、それを行うことができる方法のアプローチの下に表示されていない。

Httpにはかなりの依存関係がありますので、私の意見では最も簡単な方法はHttpModuleで指定されたプロバイダでインジェクタを作成し、次にインジェクタでインスタンスを作成させることです。

constructor() { 
    let injector = ReflectiveInjector.resolveAndCreate([ 
    {provide: Http, useFactory: httpFactory, deps: [XHRBackend, RequestOptions]}, 
    BrowserXhr, 
    {provide: RequestOptions, useClass: BaseRequestOptions}, 
    {provide: ResponseOptions, useClass: BaseResponseOptions}, 
    XHRBackend, 
    {provide: XSRFStrategy, useFactory: _createDefaultCookieXSRFStrategy}, 
    ]); 
    this.http = injector.get(Http); 
} 
+1

私はインジェクタの作成がコンストラクタ内で行われるべきだとは思わない。私も2番の角度には新しくなっていますが、ここでそのモジュールを複製しようとしています。モジュール仕様が変更された場合はどうなりますか?あなたはこのコードを維持するつもりですか? – Sebas

+0

これはうまくいくようですが、私は「間違っている」という感覚を得ています。 MVCアーキテクチャーでモデルに似た振る舞いをするクラスがある場合、どのように実装する必要がありますか? –

+1

@Sebas実際には、サービスではないクラス(あるいはおそらくコンポーネント、ディレクティブ、パイプ)で 'Http'を使う必要はないと思います。私は、可能なアプローチを示す簡潔な例を作成しようとしました。質問IMHOは、考えられるすべての建築上の影響を考慮するのに十分な情報を提供していません。 モジュールの実装が変更された場合は、コードを手動で更新する必要があります。 –

0

HTTPサービスを利用するためのあなたの理由は、比類のないままと仮定すると、私はこれはギュンターの答えの代替として働くだろうとします

import { HttpModule } from '@angular/http'; 

@NgModule({ 
    imports:  [ ..., HttpModule, ...], 
    declarations: [ ... ], 
    bootstrap: [ ... ] 
}) 
export class AppModule { } 

は、その後、私は思う:あなたがアプリケーションレベルでHttpModuleをインポートする場合

自動注射器は、ユーザークラスで動作します:

import {Http, Response} from "@angular/http" 

export class User { 
    constructor(private http: Http, private _email:string){} 

    public reload(){ 
    this.http.get("http://www.example.com") 
     .subscribe(...) 
    } 
} 

それは、その場で新しい注射器を構築しようとしているよりも安全に感じています。

+0

の問題は、私のセッションサービスのようなものに見えるということであるユーザ=新しいユーザー(「」)私は、新しいユーザーをインスタンス化していますと言うことです ' '' Provider/Injectorフレームワークの外部。これは 'Http'が未定義につながります。 –

+0

"Plain Ol 'TypeScript Classから"はDIによってインスタンス化されていないクラスを意味します。 –

+1

@MichaelPellは、セッションサービス内からhttpを取得して、手動でユーザークラスに提供できませんか? – Sebas