跳至正文
首页 » 博客 » Simplifying Different Types of Providers in Angular

Simplifying Different Types of Providers in Angular

Angular服务提供程序提供依赖项值的运行时版本。因此,当您注入服务时,Angular注入器会查看提供者以创建服务的实例。它是确定应在运行时在组件、管道或指令中注入哪个实例或值的提供程序。这里涉及许多行话,所以为了理解提供者类型的目的,让我们从创建服务开始。假设我们有一个名为ErrorService的服务它只是记录错误消息。

 “@ angular/core” 导入 {可注射}; @ 可注射()导出ErrorService { (消息: string) {logError控制台日志(信息);}}

现在,我们可以在组件中使用此服务,如下面的清单所示:

 “@ angular/core” 导入 {Component}; “./errormessage.Service” 导入 {ErrorService}; @ 组件 ({选择器: 'app-root'模板: “<input [(ngModel)]= 'err' type = 'text'/><button (click)= 'setError()'> 设置错误 </button>',提供程序: [ErrorService]})AppComponent {导出构造函数 (errorservice: private ErrorService) {}err: 字符串;setError () {这个errorservice日志错误(这个err);} } 

我们正在导入服务,在提供者数组中传递它,并将其注入组件的构造函数中。我们在按钮的点击上调用服务方法,您可以看到在控制台中传递的错误消息。很简单吧?

在这里,Angular将依赖于组件 (或模块) 的提供者数组中传递的值,以查找应在运行时注入哪个实例。

“提供者决定如何对象的某些令牌可以被创建。”

因此,当您在组件或模块的提供者数组中传递服务名称时,如下所示:

提供程序: [ErrorService]

在这里,Angular将使用令牌值ErrorService,对于令牌ErrorService,它将创建ErrorService类的对象。上述语法是以下语法的快捷方式:

提供商: [{提供: ErrorServiceuseClass: ErrorService}] 

提供属性保存作为键的令牌

  1. 定位依赖项值。
  2. 注册依赖项。

第二个属性 (有四种类型) 用于创建依赖项值。第二个参数有四个可能的值,如下所示:

  1. useClass
  2. 使用现有
  3. 使用价值
  4. useFactory

我们刚刚看到了useClass的例子。现在,考虑一个场景,您有一个名为NewErrorService的新类,用于更好的错误日志记录。

 “@ angular/core” 导入 {可注射}; @ 可注射()导出NewErrorService { (消息: string) {logError控制台日志(信息);控制台日志('由dj记录');} } 

使用现有

现在,我们希望注入NewErrorService的实例,而不是ErrorService的实例。此外,理想情况下,这两个类必须实现相同的接口,这意味着他们将有相同的方法签名与不同的实现。现在,对于令牌ErrorService,我们希望注入NewErrorService的实例。可以使用useClass来完成如下所示:

提供者: [NewErrorService,{提供:ErrorService,useClass:NewErrorService}]

上述方法的问题是,将有NewErrorService的两个实例。这可以通过使用useExisting来解决。

提供者: [NewErrorService,{提供:ErrorService,useExisting:NewErrorService}] 

现在只有一个NewErrorService实例,并且将创建NewErrorService的令牌ErrorService实例。

让我们修改组件以使用NewErrorService。

 “@ angular/core” 导入 {Component}; “./errormessage.Service” 导入 {ErrorService}; “./ newerrormessage .Service” 导入 {NewErrorService}; @ 组件 ({选择器: 'app-root'模板: “<input [(ngModel)]= 'err' type = 'text'/><button (click)= 'setError()'> 设置错误 </button><button (单击) = 'setnewError()'> 设置新的eroor</button>',提供者: [NewErrorService,{提供:ErrorService,useExisting:NewErrorService}]})AppComponent {导出构造函数(私人errorservice:ErrorService,私人newerrorservice:NewErrorService){}err: 字符串;setError () {这个errorservice日志错误(这个err);}setnewError () {这个newerrorservice日志错误(这个err);} } 

在这里,为了演示的目的,我在组件中注入服务,但是,要在模块级别使用服务,您可以注入模块本身。现在,在点击设置错误按钮NewErrorService将被调用。

使用价值

useClass和useExisting都创建服务类的实例以注入特定的令牌,但有时您希望直接传递值而不是创建实例。所以,如果你想传递readymate对象而不是类的实例,你可以使用useValue,如下面的清单所示:

提供者: [{提供: ErrorServiceuseValue: {logError: 函数 (err) {控制台日志('直接输入' err);}}} 

所以在这里,我们使用useValue注入一个现成的对象。所以对于令牌ErrorService,Angular将注入对象。

useFactory

可能会有这样的情况,直到运行时,你不知道需要什么实例。你需要在你直到最后一刻才拥有的信息的基础上创建依赖关系。让我们考虑一个示例,如果用户登录,您可能需要创建ServiceA的实例,或者如果用户未登录,则需要创建ServiceB的实例。有关登录用户的信息可能直到最后一次才可用,或者在使用应用程序期间可能会更改。

当有关依赖关系的信息是动态的时,我们需要使用useFactory。让我们考虑前面示例中使用的两个服务:

  1. ErrorMessageService
  2. NewErrorMessageService

对于特定条件下的令牌ErrorService,我们需要ErrorMessageService或newErrorMessageService的实例。我们可以使用useFactory实现这一点,如下面的清单所示:

提供者: [{提供: ErrorServiceuseFactory: () => {// 这个值可以改变; let m = 'old'if (m === 'old') {返回ErrorService () ();} else {返回NewErrorService ();}}}]

在这里,我们采取了一个非常硬编码的条件。您可能有复杂的条件来动态创建特定令牌的实例。另外,请记住,在useFactory中,您可以传递依赖关系。因此,假设您依赖LoginService来创建ErrorService令牌的实例。对于该传递LoginService是deps数组,如下面的清单所示:

提供者: [{提供: ErrorServiceuseFactory: () => {// 这个值可以改变; let m = 'old'if (m === 'old') {返回ErrorService () ();} else {返回NewErrorService ();}},deps: [LoginService]}] 

这些是在Angular中与提供者合作的四种方式。我希望你觉得这篇文章有用。谢谢你的阅读。如果你喜欢这篇文章,请分享。另外,如果您还没有签出为Angular组件点燃UI,一定要这样做!他们有30个基于材料的角度组件,以帮助您更快地编写web应用程序。</p