我的构造函数具有可选参数,它们似乎混淆了主要的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创建此类(模型),因此我现在从实例化此对象的类中手动传递服务。
答案 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]}]