angular的几种依赖注入方式

1、useClass

提供器的一种写法是这样的

providers: [...Service...],

其完全写法为

providers: [{provide:Service,useClass:Service}],

provide提供token而实际使用的服务为useClass声明的服务,下面这种

providers: [{provide:Service,useClass:anotherService}],

如果anotherService需要实现其他的类则要把类中的方法实现如:anotherService实现Service

Service类

import { Injectable } from '@angular/core';

@Injectable()
export class ServiceService {

  constructor() { }
  methods(){
    console.log('第一种服务类')
  }
}

anotherService类

import { Injectable } from '@angular/core';
import {ServiceService} from './service.service';

@Injectable()
export class AnotherServiceService implements ServiceService{

  constructor() { }
  methods(){
    console.log('另一服务服务类')
  }
  anotherMethods(){
    console.log('另一服务服务类')
  }

}

同时服务之间也可以互相使用,前提是必须加上@Injectable()装饰器,
使用法跟组件中一样在构造函数中注入服务。

2、值

它的提供器的token为字符串,使用的是useValue,可以是一个对象,也可以是一个值

providers: [{provide:‘IS_Value’,useValue:false}],

注意在组件中获取的方式略有不同,data即为获取到的值

 constructor(@Inject('IS_Value') private data) { }

3、工厂方法定义提供器

工厂方法只会被调用一次写法如下

provides:[
		{
		provide:ServiceService,
		useFactory:()=>{
			     let dev=Math.random()>0.5
			       if(dev){
			       return new ServiceService()
			       }else {
			       return new AnotherServiceService()
			       }
			  }
		 }
    ]

如果工厂函数想要使用提供器的其他服务加入属性deps,并以参数的形式传入

provides:[
	loggerService,
		{
		provide:ServiceService,
		useFactory:(logger:loggerService)=>{
			     let dev=Math.random()>0.5
			       if(dev){
			       return new ServiceService(logger)
			       }else {
			       return new AnotherServiceService(logger)
			       }
			  }
			  deps:[loggerService]
		 }
    ]

这样就相当于实例化了loggerService,不过条件不简单的是通过一个随机数,我们也可以传进去一个值

provides:[
	loggerService,
	{provide:‘IS_Value’,useValue:false}
		{
		provide:ServiceService,
		useFactory:(logger:loggerService,val)=>{
			     let dev=Math.random()>0.5
			       if(dev){
			       return new ServiceService(logger)
			       }else {
			       return new AnotherServiceService(logger)
			       }
			  }
			  deps:[loggerService,'IS_Value']
		 }
    ]

然后工厂函数会根据deps第二个值搜索并把它传给第二个参数

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值