如何注入服务一些数据? [关闭]

Posted

技术标签:

【中文标题】如何注入服务一些数据? [关闭]【英文标题】:How to inject to service some data? [closed] 【发布时间】:2020-07-04 00:38:57 【问题描述】:

我正在使用angular 9,我需要将配置数据注入服务:

@Injectable(
  providedIn: 'root'
)
export class AuthService 
  private auth: any;

  constructor(private authConfig: AppConfig) 
  

我需要将AppConfig 注入服务。我该怎么做?

【问题讨论】:

你在哪里设置AppConfig @malbarmavi 我想在app.module.ts 类中设置AppConfig 你想注入一个配置对象,对吧?您是否需要部署工具来根据您要部署到的环境替换配置中的值? 【参考方案1】:

您可以只创建一个服务并使用可注入装饰器进行装饰,然后将 provideIn 设置为 root(这将使服务成为单例)。

AppConfig

@Injectable(
  providedIn:"root"
)
export class AppConfig 

  url:string;
  port:number;


然后您可以将服务注入 appNodule 广告设置属性

...
export class AppModule 

  constructor(config:AppConfig)  
    config.url = '127.0.0.1';
    config.port = 3000;
  
 

之后,您将 appConfig 注入应用中的任何组件和服务

【讨论】:

【参考方案2】:

如果AppConfigservice,您应该按照您的方式轻松地将其注入AuthService。否则,如果 AppConfig 不是服务并且 Angular 无法注入它(因为无法通过 Angular 进行管理),那么您可能需要将 AppConfig 中的字段设为静态或在 AuthConfig 中创建一个实例手动,或使其成为单例,甚至将其添加到AppModule 中的提供程序部分。但我认为你应该让 Angular 来管理它,如果它不是 service,请将其添加到 providers

【讨论】:

【参考方案3】:

1.使用静态数据

对于简单的基于对象的配置数据 `url: "/login", ... 我建议你使用一个简单的 JSON 文件。您可以在this answer中阅读有关如何将 JSON 文件导入 Angular 项目的信息

2。使用专门的打字稿类

为了利用 typescript 的优势,你可以声明一个简单的类文件,并在那里收集你的配置作为 static 属性,绑定到类:

export class AppConfig
  public static xy = "..."

然后使用myVariable = AppConfig.xy 将其导入(不要忘记导入它)

3.使用 environment.ts

这已经在 Angular 中了,你可以使用基于环境的配置,阅读更多关于 environment.tsenvironment.prod.ts here 的信息。这很像第 2 点,但如果您运行 ng buildng build --prod,文件将被替换为不同的文件。

4.运行时配置

在您了解了前面示例的优缺点之后,您可能想知道我们是否只能在运行时提供配置,也许基于一些动态规则?是的,这是可能的,但是有点复杂,但是您可以在模块启动之前注入配置,即使是从异步调用中,也可以使用 provide: APP_INITIALIZER。阅读更多关于它的信息here

【讨论】:

我认为 environment.ts 是这里最好的情况?【参考方案4】:

一种选择是使用静态 json 文件。

    在应用程序的src/assets/ 文件夹中创建一个包含您的配置的config.json 文件。 使用 HTTP 检索服务中的配置。

auth.service.ts

import  Injectable  from '@angular/core';
import  HttpClient  from '@angular/common/http';

@Injectable()
export class AuthService 
  constructor(private http: HttpClient)  
    this.http.get('/assets/config.json').subscribe(data => 
      console.log(data);
    );
  

工作示例:Stackblitz

【讨论】:

? 可以工作,但您不需要每次需要读取配置值时都进行 http 请求,这样您就可以发出请求并将数据存储在常量 nr localStorage 之类的地方 ?【参考方案5】:

这就是环境的用途。

src/environment.tssrc/environment.prod.ts

默认内容为:

export const environment = 
  production: false
;

或用于 prod 环境

export const environment = 
  production: true
;

所以你提供你的配置,例如

import AppConfig from '../app/models/app-config';

export const environment = 
  production: false,
  authConfig: 
    clientID: 'oidc-client',
    // stuff or other
   as AppConfig
;

与 prod 环境相同或其他。

然后你像导入它一样

import Injectable from '@angular/core';
import environment from '../../environments/environment';

@Injectable(
  providedIn: 'root'
)
export class AuthService 

  private authConfig = environment.authConfig;

  constructor() 
  

对于生产版本,它将自动替换为environment.prod.ts 中的配置。

【讨论】:

环境选项是最好的之一 ?【参考方案6】:

这只是另一种方式,您可以将配置存储在 json 文件中并将文件放在资产文件夹中,然后您可以像这样使用“导入”读取文件

import * as  config from '~/src/assets/app.config.json';
console.log('?‍♂️',config)

demo ?

【讨论】:

以上是关于如何注入服务一些数据? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

网络安全面试题—如何注入攻击Java Python PHP等主流语言

SQL注入如何产生?如何防止?

网站如何防止sql注入攻击的解决办法

如何防止SQL注入漏洞

如何在表单中注入一些东西

如何在表单中注入一些东西