1. 概要
DI
と呼ばれる依存性注入 (DI) は、コード間の結合を減らすために使用される面向对象
プログラミングの设计原则
です。 [関連チュートリアルの推奨事項:「angular チュートリアル」]
class MailService { コンストラクター(APIKEY) {} } クラス EmailSender { メールサービス: メールサービス コンストラクター() { this.mailService = new MailService("APIKEY1234567890") } sendMail(メール) { this.mailService.sendMail(メール) } } const emailSender = new EmailSender() emailSender.sendMail(mail)
EmailSender クラスは実行時に MailService クラスを使用します。EmailSender クラスは MailService クラスに依存し、MailService クラスは EmailSender クラスの依存関係です。
上記の書き方では結合度が高すぎてコードが堅牢ではありません。 MailService クラスでパラメータの受け渡し方法が変更されると、EmailSender クラスの書き込みメソッドも変更されます。
クラス EmailSender { メールサービス: メールサービス コンストラクター(mailService: MailService) { this.mailService = メールサービス; } } const mailService = new MailService("APIKEY1234567890") const emailSender = new EmailSender(mailService)
EmailSender クラスをインスタンス化するときに、コンストラクターのコンストラクター パラメーターを通じてその依存関係をクラスに注入します。この記述方法は依存関係の注入です。
依存関係の注入により、コード間の結合が軽減され、コードの保守性が向上します。 MailService クラスのコード変更は、EmailSender クラスには影響しなくなりました。
2. DI フレームワーク
Angular には、依存関係注入の実装プロセスを隐藏
独自のDI 框架
があり、開発者は非常に単純なコードを使用するだけで、複雑な依存関係注入関数を使用できます。
Angular の DI フレームワークには 4 つの中心的な概念があります。
Dependency
: コンポーネントが依存するインスタンス オブジェクト、サービス インスタンス オブジェクト
Token
: サービス インスタンス オブジェクトの ID を取得します
Injector
: サービスのインスタンス オブジェクトの创建维护
担当するインジェクタークラスを取得し、コンポーネントの Service インスタンス オブジェクトに注入
(サービス オブジェクトの作成と取得を管理します)。
Provider
: インジェクターのオブジェクトを設定し、サービス クラスを指定してサービス インスタンス オブジェクトを作成し、インスタンス オブジェクトの識別子を取得します。 (プロバイダ: Provider)
インジェクタは、サービス クラス インスタンス オブジェクトを作成し、サービス クラス インスタンス オブジェクトを必要なコンポーネントに挿入する責任があります。
「@angular/core」から
インジェクター import { ReflectiveInjector } を作成します
//サービスクラス class MailService {} // インジェクターを作成し、サービス クラスに渡します const injector = ReflectiveInjector.resolveAndCreate([MailService])
インジェクター内のサービス クラス インスタンス オブジェクトを取得します
const mailService = injector.get(MailService)
サービス インスタンス オブジェクトはシングルトン モードであり、かつインジェクターは、サービス インスタンスの作成後、キャッシュされます。
const mailService1 = injector.get(MailService) const mailService2 = injector.get(MailService) console.log(mailService1 === mailService2) // true
異なるインジェクターは異なるサービス インスタンス オブジェクトを返します
const injector = ReflectiveInjector.resolveAndCreate([MailService]) const childInjector = injector.resolveAndCreateChild([MailService]) const mailService1 = injector.get(MailService) const mailService2 = childInjector.get(MailService) console.log(mailService1 === mailService2) // 偽のサービス インスタンスの検索は、
関数作用域链
と同様です。現在のレベルが見つからない場合は、現在のレベルを使用します。検索する親
const injector = ReflectiveInjector.resolveAndCreate([ MailService]) const childInjector = injector.resolveAndCreateChild([]) const mailService1 = injector.get(MailService) const mailService2 = childInjector.get(MailService) console.log(mailService1 === mailService2) // true
構成インジェクター オブジェクトは、インスタンス オブジェクトを作成するサービス クラスとサービス インスタンス オブジェクトにアクセスするための識別子を指定します。
const インジェクター = ReflectiveInjector.resolveAndCreate([ { 提供: MailService、useClass: MailService } ])
依存オブジェクトにアクセスするための識別子は、文字列型にすることもできます。
const injector = ReflectiveInjector.resolveAndCreate([ { 提供: "メール"、useClass: MailService } ]) const mailService = injector.get("mail")
useValue
const injector = ReflectiveInjector.resolveAndCreate([ { 提供:「構成」、 useValue: Object.freeze({ APIKEY: "API1234567890", APISCRET: "500-400-300" }) } ]) const Config = injector.get("Config") は
、内部コードが変更されていない限り、インスタンス オブジェクトと外部参照の間に疎結合関係を確立します。変更しても外部には影響しません。