這篇文章主要介紹Angular中依賴注入的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計、做網(wǎng)站、洋縣網(wǎng)絡(luò)推廣、成都微信小程序、洋縣網(wǎng)絡(luò)營銷、洋縣企業(yè)策劃、洋縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供洋縣建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
依賴注入:設(shè)計模式
依賴:程序里需要的某種類型的對象。
依賴注入框架:工程化的框架
注入器Injector:用它的API創(chuàng)建依賴的實例
Provider:怎樣創(chuàng)建?(構(gòu)造函數(shù),工程函數(shù))
Object:組件,模塊需要的依賴
依賴性注入進階=>Angular中依賴注入框架提供父子層次注入型依賴
一、依賴注入
class Id { static getInstance(type: string): Id { return new Id(); } } class Address { constructor(provice, city, district, street) {} } class Person { id: Id; address: Address; constructor() { this.id = Id.getInstance("idcard"); this.address = new Address("北京", "背景", "朝陽區(qū)", "xx街道"); } }
問題:Person需要清楚的知道Address和Id的實現(xiàn)細節(jié)。
ID和Address重構(gòu)后,Person需要知道怎么重構(gòu)。
項目規(guī)模擴大后,集成容易出問題。
class Id { static getInstance(type: string): Id { return new Id(); } } class Address { constructor(provice, city, district, street) {} } class Person { id: Id; address: Address; constructor(id: Id, address: Address) { this.id = id; this.address = address; } } main(){ //把構(gòu)造依賴對象,推到上一級,推調(diào)用的地方 const id = Id.getInstance("idcard"); const address = new Address("北京", "背景", "朝陽區(qū)", "xx街道"); const person = new Person(id , address); }
Person已經(jīng)不知道Id和Address的細節(jié)了。
這是最簡單的依賴注入。
問題是在main里還是需要知道細節(jié)。
思路:一級一級往上推,一直推到入口函數(shù),入口函數(shù)來處理所有對象的構(gòu)造。構(gòu)造出來后提供給所有依賴的子模塊的子類。
問題:入口函數(shù)很難維護。所以需要一個依賴注入框架幫助完成。
二、Angular的依賴注入框架
從v5開始,因為速度慢,引入大量代碼已棄用,改為Injector.create。
ReflectiveInjector:用于實例化對象和解析依賴關(guān)系。
import { Component ,ReflectiveInjector } from "@angular/core";
resolveAndCreate接收一個provider數(shù)組,provider告訴injector應(yīng)該怎樣去構(gòu)造這個對象。
constructor() { //接收一個provider數(shù)組 const injector = ReflectiveInjector.resolveAndCreate([ { provide: Person, useClass:Person }, { provide: Address, useFactory: ()=>{ if(environment.production){ return new Address("北京", "背景", "朝陽區(qū)", "xx街道xx號"); }else{ return new Address("西藏", "拉薩", "xx區(qū)", "xx街道xx號"); } } }, { provide: Id, useFactory:()=>{ return Id.getInstance('idcard'); } } ]); }
Injector:
injector相當于main函數(shù),可以拿到所有依賴池子里的東西。
import { Component ,ReflectiveInjector, Inject} from "@angular/core"; import { OverlayContainer } from "@angular/cdk/overlay"; import { Identifiers } from "@angular/compiler"; import { stagger } from "@angular/animations"; import { environment } from 'src/environments/environment'; @Component({ selector: "app-root", templateUrl: "./app.component.html", styleUrls: ["./app.component.scss"] }) export class AppComponent { constructor(private oc: OverlayContainer) { //接收一個provider數(shù)組 const injector = ReflectiveInjector.resolveAndCreate([ { provide: Person, useClass:Person }, { provide: Address, useFactory: ()=>{ if(environment.production){ return new Address("北京", "背景", "朝陽區(qū)", "xx街道xx號"); }else{ return new Address("西藏", "拉薩", "xx區(qū)", "xx街道xx號"); } } }, { provide: Id, useFactory:()=>{ return Id.getInstance('idcard'); } } ]); const person = injector.get(Person); console.log(JSON.stringify(person)); } } class Id { static getInstance(type: string): Id { return new Id(); } } class Address { provice:string; city:string; district:string; street:string; constructor(provice, city, district, street) { this.provice=provice; this.city=city; this.district=district; this.street=street; } } class Person { id: Id; address: Address; constructor(@Inject(Id) id, @Inject(Address )address) { this.id = id; this.address = address; } }
可以看到控制臺打印出person信息。
簡寫:
// { // provide: Person, useClass:Person // }, Person, //簡寫為Person
在Angular框架中,框架做了很多事,在provider數(shù)組中注冊的東西會自動注冊到池子中。
@NgModule({ imports: [HttpClientModule, SharedModule, AppRoutingModule, BrowserAnimationsModule], declarations: [components], exports: [components, AppRoutingModule, BrowserAnimationsModule], providers:[ {provide:'BASE_CONFIG',useValue:'http://localhost:3000'} ] })
constructor( @Inject('BASE_CONFIG') config) { console.log(config); //控制臺打印出http://localhost:3000 }
Angular默認都是單例,如果想要每次注入都是一個新的實例。有兩種方法。
一,return的時候return一個方法而不是對象。
{ provide: Address, useFactory: ()=>{ return ()=>{ if(environment.production){ return new Address("北京", "背景", "朝陽區(qū)", "xx街道xx號"); }else{ return new Address("西藏", "拉薩", "xx區(qū)", "xx街道xx號"); } } } },
二、利用父子Injector。
constructor(private oc: OverlayContainer) { //接收一個provider數(shù)組 const injector = ReflectiveInjector.resolveAndCreate([ Person, { provide: Address, useFactory: ()=>{ if(environment.production){ return new Address("北京", "背景", "朝陽區(qū)", "xx街道xx號"); }else{ return new Address("西藏", "拉薩", "xx區(qū)", "xx街道xx號"); } } }, { provide: Id, useFactory:()=>{ return Id.getInstance('idcard'); } } ]); const childInjector = injector.resolveAndCreateChild([Person]); const person = injector.get(Person); console.log(JSON.stringify(person)); const personFromChild = childInjector.get(Person); console.log(person===personFromChild); //false }
子注入器當中沒有找到依賴的時候會去父注入器中找。
以上是“Angular中依賴注入的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!