我正在为应用程序使用Angular 7。 我在构造函数(---)的多个组件中注入相同的依赖项。 我可以在超级类/组件中的某些位置注入并重用它吗? 请让我知道是否有人知道最佳解决方案。
预先感谢
答案 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。显式依赖原则指出,类或方法需要显式指定实现其目标所需的依赖。通过传递注入器而不是实际依赖项,您未将依赖项指定为显式。实际上,该类所需的任何依赖项都没有定义。这样一来,该类就可以从不同的执行路径中调用任意数量的服务,而无法控制其用途和不用途。
正确执行的依赖项注入有两种形式。注入构造函数参数或方法参数。这是显式,可控,可维护且类型安全的。
虽然确实需要编写更多代码。有了更多的代码,您就可以摆脱繁琐的工作。并保持您的班级可读性。通过喷油器时,没人会知道您的班级使用或不使用什么。