代码之家  ›  专栏  ›  技术社区  ›  patrick

如何将配置对象设置为可注入依赖项?

  •  0
  • patrick  · 技术社区  · 4 年前

    假设我有这样一个界面:

    interface MyConfig {
      sort: true,
      onClick: () => void,
      // ... other props
    }
    

    然后我有一个指令/组件,它利用了几个内部服务。例如,我可能在给定页面上有两到三个该指令的实例,每个实例都有自己独特的配置。。。

    我的问题是,如何使内部服务能够通过依赖注入访问各自的配置?换句话说,我希望我的服务结构如下:

    export class InternalServiceA {
      constructor (config: MyConfig) {}
    }
    ...
    export class InternalServiceB {
      constructor (config: MyConfig) {}
    }
    

    ...

    我目前正在开发一项服务,按照我的规范,我正在做:

    providers: [ { provide: MyConfig, useValue: { name: 'my-config' } } ]
    

    我得到了:

    “MyConfig”仅指类型,但在此处用作值。

    还有一个附带问题,将这些内部依赖项之一公开给其他组件的最佳方式是什么?例如,其中一个服务将负责从api端点获取数据,因此我可能有一个完全独立的组件,它需要了解来自该端点的响应的一些信息(比如总数或其他信息)。让“拥有”服务的指令之外的事物可以使用这些数据的最佳方式是什么?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Fatih Ersoy    4 年前

    你必须向依赖注入一个装饰器。您应该输入MyConfig类型,还是您创建的对象({name:'my config'})。要么如此;

    import { InjectionToken } from '@angular/core';
    
    export const MY_CONFIG = new InjectionToken<{name:string}>('my.config');
    
    providers: [ { provide: MyConfig, useValue: { name: 'my-config' } } ]
    
    export class InternalServiceA {
      constructor (@Inject(MY_CONFIG) config: {name:string}) {}
    }
    

    或者做;

    import { InjectionToken } from '@angular/core';
    
    export const MY_CONFIG = new InjectionToken<MyConfig>('my.config');
    
    providers: [ { provide: MY_CONFIG, useClass: MyConfig } ]
    
    export class InternalServiceA {
      constructor (@Inject(MY_CONFIG) config: MyConfig) {}
    }
    

    使用 使用价值 你需要初始化。它必须是一个类、对象、数组等的实例。如果你想注入你需要使用的定义 useClass .

    编辑:欲了解更多信息,请阅读 documentation .

    推荐文章