Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
发布时间 - 2026-01-11 01:42:58 点击率:次学习目录

- Angular 4 依赖注入教程之一 依赖注入简介
- Angular 4 依赖注入教程之二 组件服务注入
- Angular 4 依赖注入教程之三 ClassProvider的使用
- Angular 4 依赖注入教程之四 FactoryProvider的使用
- Angular 4 依赖注入教程之五 FactoryProvider配置依赖对象
- Angular 4 依赖注入教程之六 Injectable 装饰器
- Angular 4 依赖注入教程之七 ValueProvider的使用
- Angular 4 依赖注入教程之八 InjectToken的使用
本文主要给大家介绍了关于Angular 4依赖注入之FactoryProvider配置依赖对象的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:
本系列教程的开发环境及开发语言:
- Angular 4 +
- Angular CLI
- TypeScript
基础知识
Console 对象
Console 对象可以在任何全局对象中访问,如 Window,WorkerGlobalScope 以及通过属性工作台提供的特殊定义。在浏览器中我们可以通过 Window.console 访问 console 对象,使用示例如下:
console.log('My nickname is semlinker');
FactoryProvider 的作用
FactoryProvider 用于告诉 Injector (注入器),通过调用 useFactory 对应的函数,返回 Token 对应的依赖对象。
FactoryProvider 接口
export interface FactoryProvider {
// 用于设置与依赖对象关联的Token值,Token值可能是Type、InjectionToken、
// OpaqueToken的实例或字符串
provide: any;
// 设置用于创建对象的工厂函数
useFactory: Function;
// 依赖对象列表
deps?: any[];
// 用于标识是否multiple providers,若是multiple类型,则返回与Token关联的依赖
// 对象列表
multi?: boolean;
}
在 FactoryProvider的使用 这篇文章中,我们已经介绍了 FactoryProvider 的一些相关知识。接下来我们将介绍如何使用 FactoryProvider 配置依赖对象。
FactoryProvider
俗话说得好,温故而知新。我们先来回顾一下上一节创建的 LoggerService 服务:
export class LoggerService {
constructor(private enable: boolean) { }
log(message: string) {
if(this.enable) {
console.log(`LoggerService: ${message}`);
}
}
}
LoggerService 的正确配置方式如下:
@NgModule({
...,
providers: [
HeroService,
{
provide: LoggerService,
useFactory: () => {
return new LoggerService(true);
}
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
在继续介绍前,我们先来了解一下 Angular 的一大特色:
跨平台开发
学习如何基于 Angular 构建应用程序,并复用代码和技能来构建适用于所有平台的应用。比如:Web应用、移动Web应用、原生移动应用和原生桌面应用等。
没错,Angular 框架的一大特色就是跨平台开发。回到正题,不知道读者有没有察觉到,在 LoggerService 类中的 log() 方法内,我们是直接使用 console.log() 方法输出调试信息。虽然在大多数情况下,我们的应用都是运行在浏览器环境下,但 console.log() 存在兼容性问题 (了解详细信息 - Can I Use)。除此之外,假如日后我们的应用需要运行在其它平台下,就会出现问题。
为了解决上述问题,我们可以创建一个 ConsoleService 服务,且该服务需实现统一的 Console 接口。但本文的重点不在这里,因此我们先简单实现一个 ConsoleService 服务:
export class ConsoleService {
log(message) {
console.log(`ConsoleService: ${message}`);
}
}
接下来我们就需要更新先前的 LoggerService 服务:
export class LoggerService {
constructor(private enable: boolean,
consoleService: ConsoleService) { }
log(message: string) {
if (this.enable) {
console.log(`LoggerService: ${message}`);
}
}
}
但当我们更新完 LoggerService ,成功保存后,你会看到以下异常信息:
app.module.ts (27,16): Supplied parameters do not match any signature of call target.
这说明提供的参数与调用目标的签名不匹配,这是因为在 AppModule 中,LoggerService 的配置方式是:
{
provide: LoggerService,
useFactory: () => {
return new LoggerService(true);
}
而此时 LoggerService 构造函数输入参数的个数为两个,因此会抛出上面的异常。那么我们应该怎么解决这个问题呢?这时我们就要利用 FactoryProvider 接口中定义的 deps 属性,来声明 LoggerService 所依赖的对象。
配置 deps 属性
{
provide: LoggerService,
useFactory: (consoleService) => {
return new LoggerService(true, consoleService);
},
deps: [ConsoleService]
}
更新 AppModule
@NgModule({
...,
providers: [
HeroService,
ConsoleService,
{
provide: LoggerService,
useFactory: (consoleService) => {
return new LoggerService(true, consoleService);
},
deps: [ConsoleService]
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
当更新完代码,然后再来一个华丽的保存操作,最后打开你的控制台,你又看到预期的输出信息:
LoggerService: Fetching heros...
我有话说
工厂函数是用来干嘛的?
在现实生活中,工厂是用来生产产品的,如鞋子工厂用来生产鞋子。而 FactoryProvider 接口中 useFactory 属性对应的工厂函数就是用来创建依赖对象。此外生产一双鞋子也需要对应的材料,如鞋底、鞋带等,而创建依赖对象也可能需要依赖其它对象,因此 FactoryProvider 接口中定义了 deps 属性用来声明依赖对象列表。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用Angular 4能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# angular4
# 依赖注入
# angular依赖注入
# angularjs依赖注入
# Angular 4依赖注入学习教程之InjectToken的使用(八)
# Angular 4依赖注入学习教程之ValueProvider的使用(七)
# Angular 4依赖注入学习教程之Injectable装饰器(六)
# Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
# Angular 4依赖注入学习教程之ClassProvider的使用(三)
# Angular 4依赖注入学习教程之组件服务注入(二)
# Angular 4依赖注入学习教程之简介(一)
# 深入理解Angular4中的依赖注入
# 一大
# 我们可以
# 这篇文章
# 先来
# 都是
# 就会
# 温故而知新
# 相关内容
# 你会
# 我有
# 是用来
# 适用于
# 俗话说得好
# 给大家
# 再来
# 来看看
# 你又
# 之二
# 谢谢大家
# 我们应该
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
浅析上传头像示例及其注意事项
如何在阿里云部署织梦网站?
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
Laravel集合Collection怎么用_Laravel集合常用函数详解
jQuery 常见小例汇总
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
nodejs redis 发布订阅机制封装实现方法及实例代码
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
如何安全更换建站之星模板并保留数据?
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
活动邀请函制作网站有哪些,活动邀请函文案?
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
简单实现jsp分页
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
,怎么在广州志愿者网站注册?
重庆市网站制作公司,重庆招聘网站哪个好?
高防服务器租用指南:配置选择与快速部署攻略
Laravel如何保护应用免受CSRF攻击?(原理和示例)
网站制作软件免费下载安装,有哪些免费下载的软件网站?
如何用搬瓦工VPS快速搭建个人网站?
在线制作视频网站免费,都有哪些好的动漫网站?
微信小程序 五星评分(包括半颗星评分)实例代码
如何用花生壳三步快速搭建专属网站?
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
如何在自有机房高效搭建专业网站?
公司网站制作价格怎么算,公司办个官网需要多少钱?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何在香港服务器上快速搭建免备案网站?
php 三元运算符实例详细介绍
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
高端云建站费用究竟需要多少预算?
Laravel如何为API生成Swagger或OpenAPI文档
如何基于PHP生成高效IDC网络公司建站源码?
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
如何在宝塔面板中创建新站点?
如何快速生成专业多端适配建站电话?
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
网站图片在线制作软件,怎么在图片上做链接?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
高防服务器如何保障网站安全无虞?
Laravel如何使用Collections进行数据处理?(实用方法示例)
html5的keygen标签为什么废弃_替代方案说明【解答】
动图在线制作网站有哪些,滑动动图图集怎么做?
下一篇:CC3D 刷固件
下一篇:CC3D 刷固件

