一、imports,declarations,providers介绍

imports中写入的是当前模块导入的其他模块,故imports应该导入的是module;declarations中写入的是当前模块内包含的公共组件、指令信息,故其中应该是声明的是components;prividers是导入当前模块可以使用的公共服务,也可以是其他npm包中的服务,故其中导入的应该是service。代码示例如下:

@NgModule({

declarations: [AppComponent, InjectionDemoComponent],

imports: [BrowserModule],

providers: [{ provide: UserInfoService, useClass: LoginUserInfoService }],

bootstrap: [AppComponent]

})

其中provides中导入服务有较多的形式,将在下文做详细的介绍。

二、定义提供器的方式

1.基本方式

providers: [LoginUserInfoService]

基本方式中,可以直接在provides中将需要的服务写入,相当于使用new实例化了一个对象,这样的话就可以在其他的服务或者组件中使用该服务。

2.uerClass

providers:

[{ provide: UserInfoService, useClass:LoginUserInfoService }]

使用useClass可以根据需要,选择注入非默认的服务。

3.useFactory

providers: [

// { provide: UserInfoService, useClass: LoginUserInfoService }

{

provide: UserInfoService,

useFactory: () => {

const dev = Math.random() > 0.5;

console.log(dev);

if (dev) {

return new LoginUserInfoService();

} else {

return new LogoutUserInfoService();

}

},

deps: []

}

使用useFactory可以根据不同的条件,使用不同的服务。在上述代码中,dev为随机生成的一个判断的条件,通过useFactory可以返回不同的服务,这样在其他地方调用UserInfoService时就会使用不同的服务,展示不同的结果。其中,deps是Factory中需要注入的内容。

4.useValue

变量也可以如服务一般备注入,可以使用如下方法注入:

providers: [

// { provide: UserInfoService, useClass: LoginUserInfoService }

{

provide: UserInfoService,

useFactory: isDev => {

// const dev = Math.random() > 0.5;

console.log(isDev);

if (isDev.isDev) {

return new LoginUserInfoService();

} else {

return new LogoutUserInfoService();

}

},

deps: ['IS_DEV']

},

// { provide: 'IS_DEV', useValue: true }

{ provide: 'IS_DEV', useValue: { isDev: true } }

],

其中16行为为注入了一个变量,在其他需要的地方就可以注入这个变量,如可以先在3中的useFactory的deps中注入这个变量,然后就可以在其中使用。当然,useValue可以是一个普通变量,也可以是一个对象(如上述代码17行所示)。

三、多级注入器

1.在@Injectable级进行配置

@Injectable()装饰器会标出每一个服务类。服务类的元数据选项providerIn会指定一个注入器,同常会使用root作为该服务的提供商。当可注入的类向root注入器提供了自己的服务时,任何导入该类的地方都能使用这个服务。

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

import { User } from '../User';

import { UserInfoService } from './user-info.service';

@Injectable({

providedIn: 'root'

})

export class LoginUserInfoService implements UserInfoService {

getUser() {

return new User(1, 'login');

}

constructor() {}

}

在其他服务中使用该服务(代码只展示部分内容):

import { LoginUserInfoService } from '../service/login-user-info.service';

constructor(private loginUserInfoService: LoginUserInfoService) {}

除了指给root注入器之外,我们还可以将providerIn设置为某个特定的NgModule。一般来说,这中写法和在@NgModule本身的装饰器上配置注入器没有多少的不同,主要的区别就是如果@NgModule没有用到改服务,那么它可以被优化掉。

2.@NgModule级注入器

我们还可以在非根NgModule元数据的providers选项中配置一个模块级的提供商,这样可以将该服务的范围限制在该模块这一级别。如果在AppModule的@NgModule()元数据中配置了全应用级的提供商,那么它将会覆盖通过@Injectable()配置的那一个。你可以用这种方式来为那些供多个应用使用的服务指定非默认的提供商。代码如下:

providers:

[{ provide: UserInfoService, useClass:LoginUserInfoService }]

3.Component级注入器

NgModule 中每个组件都有它自己的注入器。 通过使用 @Component 元数据在组件级配置某个提供商,你可以把这个提供商的范围限定到该组件及其子组件。以下代码摘至Angular中文网:

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

import { HeroService } from './hero.service';

@Component({

selector: 'app-heroes',

providers: [ HeroService ],

template: `

Heroes

`

})

export class HeroesComponent { }

四、参考文献

[2] 慕课网课程

注:刚刚开始学习Angular,将使用写系列文章来记录学习笔记及学习过程。如文中有描述不正确或者不标准的内容希望大家可以在评论中予以指正,万分感谢。

angular 注入器配置_angular依赖注入相关推荐

  1. angular 注入器配置_Angular依赖注入介绍

    依赖注入(DI -- Dependency Injection)是一种重要的应用设计模式.Angular里面也有自己的DI框架,在设计应用时经常会用到它,它可以我们的开发效率和模块化程度. 依赖,是当 ...

  2. angular 注入器配置_Angular 教程:异步加载和依赖注入

    我已经受够了用hard-coded数据来写应用...现在我们来尝试使用Angular提供的$http服务来从后台抓取一个大一点的数据集.我们会使用依赖注入的方式来给PhoneListCtrl控制器提供 ...

  3. angular 注入器配置_Angular injector注入器

    var app = angular.module('myApp', ['ng']); //通过service方法创建自定义服务 app.service('$test', function () { t ...

  4. ABP 详解系列4:ABP框架的基础配置及依赖注入讲解

    ABP框架的基础配置及依赖注入讲解 这篇文章主要介绍了ABP框架的基础配置及依赖注入讲解,是ABP框架上手使用的基本,要的朋友可以参考下 配置ABP 配置是通过在自己模块的PreInitialize方 ...

  5. angular依赖注入_Angular依赖注入简介

    angular依赖注入 by Neeraj Dana 由Neeraj Dana In this article, we will see how the dependency injection of ...

  6. angular 注入器配置_Angular2 多级注入器详解及实例

    angular2 的依赖注入包含了太多的内容,其中的一个重点就是注入器,而注入器又非常难理解,今天我们不深入介绍注入器的内容,可以参考官方文档,我们今天来说注入器的层级. 也就是组件获取服务的容器会选 ...

  7. angular 注入器配置_注入器和发布库–AngularJS学习笔记(三)

    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. AngularJS的一大特性就是Module的加载和依赖注入,本文将分析一 ...

  8. abp项目怎样发布到服务器,ABP框架的基础配置及依赖注入讲解

    配置ABP 配置是通过在自己模块的PreInitialize方法中来实现的 代码示例如下: ? 和orchard类似,abp框架一开始就被设计成模块化的,不同的模块可以通过abp框架来进行配置.举个例 ...

  9. Spring配置、依赖注入

    Spring配置 别名 使用alias标签 <alias name="user" alias="123"/> 使用name属性 <bean i ...

最新文章

  1. 2018会考计算机成绩查询入口,2018年山东会考成绩查询时间及入口
  2. python【数据结构与算法】01背包问题(附例题)
  3. python编程if语法-讲解Python中if语句的嵌套用法
  4. 让Oracle SQL Developer显示的时间包含时分秒
  5. extern 关键字用法
  6. 【转载】生物软件之DNA分析
  7. MySQL图形化管理器——EMS SQL Management Studio
  8. 敏捷开发“松结对编程”系列之七:问题集之一
  9. angular for 停顿几秒后继续执行_Java 循环结构 for, while 及 do…while
  10. javap命令生成native需要的签名
  11. 计算机网页文档无法复制怎么办,电脑网页不能右键复制怎么办|电脑无法复制网页内容的解决方法...
  12. ios相机黑边_iOS相机去黑框
  13. java 小技巧_成为JAVA高手的25个小窍门
  14. mysql 允许主码重复_数据库主码可以重复吗
  15. 微软怎么设计Exchange 2003的体系结构
  16. 实现flv格式网络摄像头实时视频预览(nginx-rtmp,ffmpeg)
  17. 【Fracturing amp; Destruction】Unity3D的物体爆裂、炸裂、碎裂效果
  18. matlab对遥感影像投影转换,在matlab中实现遥感影像和shp文件的结合显示
  19. 不可不知的银行业务知识-整理版
  20. 淮阳中学2021年高考成绩查询,淮阳中学召开2021届高三高考200天冲刺誓师大会及学生家长会...

热门文章

  1. R语言构建广义相加模型(GAM:Generalized Additive Model)实战
  2. R语言data.table导入数据实战:data.table生成新的数据列(基于已有数据列)、生成多个数据列
  3. python使用pandas基于时间条件查询多个oracle数据表
  4. 机器学习数据预处理之离群值/异常值:图像对比法
  5. 自然语言处理NLP之文本蕴涵、智能问答、语音识别、对话系统、文本分类、情感计算
  6. 半监督+标签传播算法
  7. 通过tushare获取贵州茅台和中国平安历史交易数据并使用plotly进行可视化分析
  8. RNA-Seq入门  如何跑通一个Rna-Seq流程
  9. 三代测序之微生物基因组 de novo 测序
  10. Samtools安装与使用