在Angular中使用`useFactory`和`deps:[]`的正确方法是什么?

问题描述:

我想使用一个简单的供应商useFactory这也将使用deps学习目的)。在Angular中使用`useFactory`和`deps:[]`的正确方法是什么?

所以我创造了这个plnkr

//app.module.ts 
... 
const randomFactory = (car,engine) => { return new Calc(car,engine); }; 
... 
providers: [Car,Engine, 
      { provide: 'Random', 
       useFactory: randomFactory , 
       deps: [Car, Engine], 
      }, 
      ] 

其中Calc是:

export class Calc 
{ 
    car:Car; 
    engine:Engine; 

    constructor (Engine engine, Car car) 
    { 
    this.car=car; 
    this.engine=engine; 
    } 
    doSomething(){alert(this.car.getInfo() + this.engine.getInfo()} 
} 

现在我想,所以我这样做是为了使用它作为一个注入对象:

export class AppComponent { 
    constructor(@Inject('Random') r) { 
    r.doSomething(); //should alert "car data + engine data" , but I get an error. 
    } 
} 

但是我得到一个错误:汽车没有定义

问:

我看不出使用deps:[]的任何一点如果我已经声明,主要的应用模块模块(所以它在全球的应用是已知的),并在Calc我导入这些类的类。

那么我该如何修复我的代码才能正确使用deps:[]

plnkr

的提供程序的配置是否正确。 Calc构造函数中出现语法错误。的论点正确的声明如下:

constructor (engine: Engine, car: Car){ 

这里是更新plunker:

https://plnkr.co/edit/HsECR0HEcIaPNbK6A7ZZ?p=preview

+2

感谢(太多C#)。那么,如果在全局模块范围中已经知道“Car”和“Engine”,为什么我需要'deps'? –

+1

@Royi它决定了提供者需要什么以及传递给工厂函数的参数的顺序 –

+0

正如@peeskillet所说,有人应该告诉Angular哪些​​参数应该传递给工厂函数。 –