2016-01-03 11 views
8

私は、Httpサービスを使用する基本的なAngular2アプリケーションを接続しようとしています。私が作成したいと考えブートストラップを通じてサービスにサービスを注入できますか?

- (それは別の問題だ。私が見てきたチュートリアルの大部分は、薄いコントローラの基本的な考え方は変わっていない限りComponentが間違っているようだHttpサービスを、消費を持っていることによって、これを行います) AngularのHttpサービスを使用するサービスです。

boot.ts:

import {bootstrap} from 'angular2/platform/browser'; 
import {AppComponent} from './app.component'; 
import {HTTP_PROVIDERS } from 'angular2/http'; 

bootstrap(AppComponent, [HTTP_PROVIDERS]); 

myService.ts:

import {Injectable} from 'angular2/core'; 
import {Http} from 'angular2/http'; 

@Injectable() 
export class aService{ 
    constructor(http:Http){ 
    } 
    /** do some stuff *// 
} 

これは動作しますが、それは非常に思えるが、私はこれ以外のHttpのサービスを注入する方法を見つけ出すことはできませんサービスのユーザにサービスの依存関係を知らせ、ブートストラッププロセスにそれらを注入することが要求されるのは間違いです。コンポーネントに同じ方法でproviders配列をサービスに直接渡す方法があるようですが、見つけられません。私は何かを逃していますか?

+0

"薄いコントローラの基本的な考え方が変わっていない限り" - それはありません。 [アーキテクチャの概要](https://angular.io/docs/ts/latest/guide/architecture)を引用してください。html)ガイド:「コンポーネントの役割は、ユーザーエクスペリエンスを有効にすることです。それは、ビューとアプリケーションロジックを仲介します...サービスにすべてのことを簡単に委任します。 –

+0

ありがとう@MarkRajcok - これは私がそれを行うべきだと思う方法です。私の混乱は、ドキュメンテーションがそれ以上のことをしているコントローラを示しているという事実から来ている。 (例:https://angular.io/docs/js/latest/api/http/Http-class.html)コンポーネントが本当に薄いと思われる場合、おそらくhttpを頻繁に扱わないことになりますが、ドキュメントはそれが正常であることを暗示しています。 –

+0

APIドキュメントの例は、アプリを設計するためのベストプラクティスに従うことはまずありません。それはおそらく妥当でしょう。 –

答えて

3

更新

親インジェクタはこの1つが使用されているOtherServiceのための実装を提供する場合、この方法で、それ以外の場合はOtherServiceImplが使用されている(デフォルト)。あなたが提供する場合は

@Injectable() 
class SomeService { 
    OtherService _other; 

    SomeService(Injector injector) { 
    _other = injector.getOptional(OtherService); 
    if (_other == null) { 
     _other = injector.resolveAndCreateChild([ 
     provide(OtherService, useClass: OtherServiceImpl) 
     ]).get(OtherService); 
    } 
    _other.doSomething(); 
    } 
} 

bootstrap(AppElement, [ 
    provide(OtherService, useClass: OtherServiceImpl2) 
]); 

OtherServiceImpl2のような別のものが使用されています。

はあなただけ(@Optional()注釈を使用して)httpサービスをオプションにして何も提供されていない場合だけnew Http()とコンストラクタの内部でインスタンスを作成することができますまた、オリジナルhttps://github.com/angular/angular/issues/5622

参照してください。 このようにして、ユーザーはにはサービスの依存関係を知るためにが必要ですが、必要に応じて(テストなどのために)別の実装を渡すことができます。 サービス内で依存関係を作成するにはDI自体が必要な場合は、インジェクタを注入してそれを使用して依存関係を取得することができます。 http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html

で も参照してくださいオプションの依存関係は何も(まだ自分自身を試していない)仕事ができることはただ

class Dependency { 
    } 

    @Injectable() 
    class NeedsDependency { 
    dependency; 
    constructor(@SkipSelf() dependency:Dependency) { 
     this.dependency = dependency; 
    } 
    } 

    var parent = Injector.resolveAndCreate([Dependency]); 
    var child = parent.resolveAndCreateChild([NeedsDependency]); 
    expect(child.get(NeedsDependency).dependency instanceof Depedency).toBe(true); 

    var inj = Injector.resolveAndCreate([Dependency, NeedsDependency]); 
    expect(() => inj.get(NeedsDependency)).toThrowError(); 
SkipSelfMetadataドキュメントから自己

をスキップする子インジェクターを作成し、それを指示することです

親が要求されたタイプを提供できない場合、これが依然として "self"から解決されるかどうかはまだ分かりません。

+0

私は自分自身を 'new'と呼んで、依存関係を作成すると思ったのです。 –

+0

あなたは正しいです。インスタンス化されたクラスに依存性がある場合、これは機能しません。完全に動作する例では、子インジェクタを作成し、この子インジェクタからインスタンスを取得する必要があります。この例を更新します。 –

+0

soouglyを読んでくれてありがとう! –

関連する問題