如何避免在多个组件中注入相同的依赖项

时间:2019-06-09 11:31:01

标签: angular

我正在为应用程序使用Angular 7。 我在构造函数(---)的多个组件中注入相同的依赖项。 我可以在超级类/组件中的某些位置注入并重用它吗? 请让我知道是否有人知道最佳解决方案。

预先感谢

2 个答案:

答案 0 :(得分:0)

如果总是相同的注入,则可以使用抽象组件并使用Injector

export abstract class BaseComponent {

    protected myService1: MyService1;
    protected myService2: MyService2;
    protected myService3: MyService3;

    constructor(@Inject(Injector)public injector: Injector) {
        this.myService1 = injector.get(MyService1);
        this.myService2 = injector.get(MyService2);
        this.myService3 = injector.get(MyService3);
    }
}

@Inject允许您在子代上没有构造函数。

有孩子:

export class MyComponent extends BaseComponent {
    constructor(public injector: Injector) {
        super(injector);
    }
    ...
}

export class MyComponent extends BaseComponent {
    ...
}

答案 1 :(得分:-1)

不。您可以在超类中定义它并使用它,但是必须在要实例化的类/组件中进行注入。

class ComponentBase {

  constructor(protected service: SomeService) { }
}

class MyComponent extends ComponentBase {

  constructor(service: SomeService) { super(service) }

  doSomething() {
    this.service.doSomething()
  }
}

如您所见,没有真正的好处。

编辑:已经提出了一种解决方法,该方法可以通过传递注入器而不是依赖项来显着减少样板。我认为这是不好的做法,并且违反了explicit dependencies principle。显式依赖原则指出,类或方法需要显式指定实现其目标所需的依赖。通过传递注入器而不是实际依赖项,您未将依赖项指定为显式。实际上,该类所需的任何依赖项都没有定义。这样一来,该类就可以从不同的执行路径中调用任意数量的服务,而无法控制其用途和不用途。

正确执行的依赖项注入有两种形式。注入构造函数参数或方法参数。这是显式,可控,可维护且类型安全的。

虽然确实需要编写更多代码。有了更多的代码,您就可以摆脱繁琐的工作。并保持您的班级可读性。通过喷油器时,没人会知道您的班级使用或不使用什么。