angular服务的单例模式(依赖注⼊模式下)详解 ⽂章中有不合理和错误的地⽅欢迎⼩伙伴雅正
angular官⽅⽂档单例服务的说明
单例模式就不要说了,懂点设计模式的都懂得,真有不明⽩的⾃⾏百度。
(解释下angular的命名,angular就是angular2+,angular1叫angularjs,⾄于angular2,3,4,5,6只是angular的版本,通称angular,希望⼩伙伴不要叫错了)
单例模式如何在angular的服务中使⽤呢,angular的官⽅⽂档中有这么⼀段话:
单例服务
服务在每个注⼊器的范围内是单例的。 在任何⼀个注⼊器中,最多只会有同⼀个服务的⼀个实例。
这⾥只有⼀个根注⼊器,⽽ UserService 就是在该注⼊器中注册的。 所以,在整个应⽤中只能有⼀个 UserService 实例,每个要求注⼊ UserService 的类都会得到这个服务实例。
不过,Angular DI 是⼀个 多级注⼊系统,这意味着各级注⼊器都可以创建它们⾃⼰的服务实例。 Angular 总会创建多级注⼊器。
笼统,并不知道依赖注⼊服务单例模式怎么⽤,要想弄明⽩很简单,简单的写个例⼦实验⼀下就可以了,下⾯我会给⼤家说⼀下我的实验总结,帮助⼩伙伴节约⼀些这种乏味的探索时间。
实验样例代码
服务代码
import { Injectable } from '@angular/core';
@Injectable(
//{providedIn: 'root'}
)
export class SingletonServiveTestService {
private _name = "primaryName";
constructor() { }
setName (name){
this._name = name;
}
getName(){
return this._name;
}
}
⼩伙伴可能会说了,这TM怎么会是单例模式。⼩伙伴不要激动,我也是这么想的,怎么TM怎么会是单例。不过在angular的依赖注⼊中,有⼏种写法确实会使这种代码以单例模式的⽅式运⾏。
解释下{providedIn: 'root'},⼀开始认为只要传⼊这个对象,让服务以root的⽅式提供给⼦module,⼦组件,然后这个服务就是单例的,后台发现,这个对象和单例没有半⽑钱关系,它只是dule中引⼊服务的另⼀种写法,除了这个⽤处,没有别的⽤处,所以下⽂中我们就不说添加和不添加{providedIn: 'root'}的情况了angular和angularjs
注⼊代码
注⼊分为Module.providers和Component.providers两种;实验的module是实现懒加载的。
上⾯代码的测试结果(module都是懒加载的)
这三个结果已经代表各种情况了,如果⼩伙伴还想知道其他⼀些情况的下的结果,⼩伙伴可以⾃⼰动⼿写个例⼦,或者给我留⾔
1. 在dule.providers或者appponent.providers中依赖⾯进去这个服务,在⼦component和⼦module中的component中的构造
函数中国呢注⼊进去这个服务,这个服务的表现特征是 单例 的。
2. 在懒加载的⼦module.providers 中依赖进去这个服务,在这个module下⾯的component中的构造函数中注⼊进去这个服务,这个服务
表现特征是 单例 的。
3. 在component.providers中依赖进去这个服务,然后在component的构造函数中依赖注⼊进去这个服务,这个服务表现特征是 ⾮单例
的.
单例不都通过静态属性来实现的吗?
我认为单例就是实现属性⽅法的保持⼀个实例,⽽angular中想⽤到单例多是实现⼀些数据整个项⽬通⽤,按照设计模式上讲上⾯和下⾯的代码都不是标准的单例模式的写法,但是在实际使⽤中确实是达到了单例模式的⽬的,上吗的有angular的官⽅⽂档做背书,所以我就写了上吗那种在angular中可以是单例模式,⾄于下⾯这中我就叫静态属性单⼀模式,ts静态属性被编译成正常的js,就是构造函数上的属性⽽已,概念⾼⼤上,原理矮⼩low。
import { Injectable } from '@angular/core';
@Injectable()
export class SingletonServiveTestService {
private static _name = "primaryName";
constructor() { }
setName (name){
SingletonServiveTestService._name = name;
}
getName(){
return SingletonServiveTestService._name;
}
}
这个实验着在各种情况下都能表现 单例 特征
这种⽅法万⾦油,单例就⽤这中不久ok了,⼩伙伴写代码要考究,莫要粗放。结合上⾯代码代码的单例实现根据具体使⽤场景来选择⽤那种⽅式。
真正严格的⽤单例模式的话是⽤不上angular服务的依赖注⼊的这套机制的。⾄于要不要使⽤单例抛掉依赖注⼊,看业务场景了。
如果能帮助到⼩伙伴的话欢迎点个赞
如果能帮助到⼩伙伴的话欢迎点个赞
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论