-3

本当に知りたい プロバイダーとは?angular2のDIとの関係は?

app.module.ts

@NgModule({
  imports: [
    BrowserModule,
    FormsModule,
  ],
  declarations: [
    test,
  ],
  bootstrap: [ AppComponent ],
  providers: [
    userService
  ]
})
export class AppModule { }

test.component.ts

export class TestComponent implements OnInit, OnDestroy {
constructor(public user: userService)
}

私の理解では、プロバイダーにはサービス リスト トークンが含まれており、インジェクターはこれらのサービス トークンを新しいサービス インスタンスに使用します。サービスはプロバイダーに登録する必要があります。

サービス インスタンスがインジェクターまたはプロバイダーによって作成されているかどうかわかりませんか? インジェクターによって作成された場合、なぜプロバイダーが必要なのですか?

4

3 に答える 3

1

プロバイダーは、DI がインスタンスを作成したり、コンストラクターに渡す必要がある値や を使用して要求された値を取得したりするための戦略ですinjector.get(..)

providers: [
  MyService // short form for
  { provide: MyService, useClass: MyService },

  // create instance of `MyServiceMock` when `MyService` is requested
  { provide: MyService, useClass: MyServiceMock },  

  // redirect to a provider for `MyService` (^^^ use this one on the previous line)
  { provide: MyServiceMock, useExisting: MyService }, 

  // custom code to create an instance
  { provide: MyService, useFactory: (a, b) => new MyMockService(a, b), deps: [Http, new Inject('foo')]},

  { provide: 'foo', useValue: 'bar' }
]

(に渡される値provide: ...は、プロバイダーを検索するためのトークンです。他のパラメーターは、インスタンスを作成するために使用する戦略です)

DI がクラスのインスタンスを作成するとき、インスタンスを作成する必要があるクラスのコンストラクター パラメーターまたはdepsプロバイダーのパラメーターを読み取り、そのインスタンスを作成するためにそのコンストラクターに渡す必要がある値を把握します。

次に、これらの必要なパラメーター値に一致するプロバイダーを検索します (コンストラクター パラメーターの型、または@Inject(...)デコレーターを使用してコンストラクター パラメーターに割り当てられたトークンによって)。

@Injectable() 
class MyService {}

@Component(...) 
class MyComponent {
  constructor(private myService:MyService) {}
}

Angular がMyComponentインスタンスを必要とする場合、DI から要求します。DI がインスタンスを作成するには、インスタンスをMyServiceコンストラクターに渡すことができるようにする必要があります。DI はプロバイダーを検索してMyServiceインスタンスを作成します。以前にインスタンスが作成されている場合は、このインスタンスが再利用されます。

プロバイダーが登録されている場所は、コンストラクターに渡されるインスタンスまたは値を定義します。
この例では、コンポーネント プロバイダーのインスタンスが注入されます。
コンポーネントにproviders: [MyService]行がない場合は、プロバイダーからのインスタンス@NgModule()が注入されます。

@NgModule({
  ...
  providers: [MyService],
})

@Component({
  providers: [MyService], 
}) 
class MyComponent {
  constructor(private myService:MyService) {}
}

各子コンポーネントには、親コンポーネント インジェクターの子インジェクターである独自のインジェクターがあります。コンポーネントが作成されると、DI はコンポーネント インジェクターでプロバイダーを検索し、次に親コンポーネント インジェクターで ..., up too を検索し、次にインジェクターでプロバイダーを検索しAppComponentます@MgModule()。必要なトークンのプロバイダーを持つ最初のインジェクターは、インスタンスを取得するために使用されます。これは、プロバイダーを提供する場所が重要であることを意味します。プロバイダーをコンポーネントに追加すると、提供されたサービスのインスタンスが、コンポーネント インスタンスと同じ数だけ取得されます。プロバイダーのみを追加する@NgModule(...) class AppModule{}と、アプリケーション全体でインスタンスが 1 つだけになります。

遅延ロードされたモジュールは、さらに複雑になります。詳細については、ドキュメントを確認してください。

于 2017-07-21T07:20:33.040 に答える