具有可选参数的

时间:2016-04-06 09:14:55

标签: dependency-injection typescript angular

我的构造函数具有可选参数,它们似乎混淆了主要的DI方式。

constructor(public name:string, public age?:number, private _service:Service);

可以理解的是,我不喜欢将非可选参数放在可选参数之后,而且在未设置可选参数时不会注入服务。我该如何解决?我不能把它放在构造函数中的其他地方,因为我希望手动设置服务。

是否有类似野外注射的东西?

@Inject() private _service:Service;

constructor(public name:string, public age?:number);

我应该用默认值替换可选参数吗?还有其他建议吗?

修改 如下所述,我尝试将服务注入到一个非Angular的DI创建的对象中。这不起作用。由于我无法使用DI创建此类(模型),因此我现在从实例化此对象的类中手动传递服务。

2 个答案:

答案 0 :(得分:19)

只需在构造函数参数之前添加@Optional()装饰器,只有在注册了提供者的情况下才应该注入。

constructor(public name:string, @Optional() public age:number)

答案 1 :(得分:3)

如果我理解你正在尝试做什么,你需要一个服务工厂。见这里:https://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider

基本上,

class MyClass {
    constructor(public name:string, private _service:Service, public age?:number){}
}

然后

let myFactory = (_service: Service) => {
  return isAgeOk ? new MyClass(name, _service, age) : new MyClass(name, _service);
};

然后你应该提供这样的服务:

providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}]