Angular 4 依赖注入教程之五 FactoryProvider配置依赖对象
目录
阅读须知本系列教程的开发环境及开发语言:
基础知识Console 对象Console 对象可以在任何全局对象中访问,如 console.log('My nickname is semlinker'); FactoryProvider 的作用FactoryProvider 用于告诉 Injector (注入器),通过调用 FactoryProvider 接口export interface FactoryProvider { // 用于设置与依赖对象关联的Token值,Token值可能是Type、InjectionToken、 // OpaqueToken的实例或字符串 provide: any; // 设置用于创建对象的工厂函数 useFactory: Function; // 依赖对象列表 deps?: any[]; // 用于标识是否multiple providers,若是multiple类型,则返回与Token关联的依赖 // 对象列表 multi?: boolean; } 在 FactoryProvider的使用 这篇文章中,我们已经介绍了 FactoryProvider俗话说得好,温故而知新。我们先来回顾一下上一节创建的 export class LoggerService { constructor(private enable: boolean) { } log(message: string) { if(this.enable) { console.log(`LoggerService: ${message}`); } } }
@NgModule({ ...,providers: [ HeroService,{ provide: LoggerService,useFactory: () => { return new LoggerService(true); } } ],bootstrap: [AppComponent] }) export class AppModule { } 在继续介绍前,我们先来了解一下
没错, 为了解决上述问题,我们可以创建一个 export class ConsoleService { log(message) { console.log(`ConsoleService: ${message}`); } } 接下来我们就需要更新先前的 export class LoggerService { constructor(private enable: boolean,consoleService: ConsoleService) { } log(message: string) { if (this.enable) { console.log(`LoggerService: ${message}`); } } } 但当我们更新完 app.module.ts (27,16): Supplied parameters do not match any signature of call target. 这说明提供的参数与调用目标的签名不匹配,这是因为在 { provide: LoggerService,useFactory: () => { return new LoggerService(true); } 而此时 配置 deps 属性{ provide: LoggerService,useFactory: (consoleService) => { return new LoggerService(true,consoleService); },deps: [ConsoleService] } 更新 AppModule@NgModule({ ...,ConsoleService,useFactory: (consoleService) => { return new LoggerService(true,consoleService); },deps: [ConsoleService] } ],bootstrap: [AppComponent] }) export class AppModule { } 当更新完代码,然后再来一个华丽的保存操作,最后打开你的控制台,你又看到预期的输出信息: LoggerService: Fetching heros... 我有话说工厂函数是用来干嘛的?在现实生活中,工厂是用来生产产品的,如鞋子工厂用来生产鞋子。而 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |