【问题标题】:DI constructor with optional parameters带有可选参数的 DI 构造函数
【发布时间】:2016-07-26 14:07:58
【问题描述】:

我的构造函数有可选参数,它们似乎与执行 DI 的主要方式相混淆。

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

可以理解,Typescript 不喜欢我将非可选参数放在可选参数后面,此外,当未设置可选参数时,服务不会被注入。我该如何解决?我不能把它放在构造函数的其他地方,因为我需要手动设置服务。

有没有类似现场注入的东西?

@Inject() private _service:Service;

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

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

编辑: 如下所述,我尝试将服务注入到不是由 Angular 的 DI 创建的对象中。这行不通。由于我无法使用 DI 创建此类(模型),因此我现在从实例化此对象的类中手动传递服务。

【问题讨论】:

    标签: dependency-injection typescript angular


    【解决方案1】:

    只需在构造函数参数之前添加@Optional() 装饰器,只有在注册了提供程序时才应该注入。

    import { Optional } from '@angular/core';    
    
    constructor(public name:string, @Optional() public age:number)
    

    【讨论】:

    • 我可能遗漏了一些东西,但“年龄”不是我想要注入的东西。我使用 new Person("Mike", 32); 之类的构造函数创建新对象,Service 应该独立于设置年龄而注入。还是我只需要用@Optional() 注释每个可选(TS=?)?
    • 不确定我是否完全理解您的问题。使用new Person("Mike", 32) 根本不涉及依赖注入。只有当实例由 DI 自己创建时,才会涉及 DI。例如,组件及其依赖项由 DI 实例化。你能澄清一下吗?
    • "只有当实例由 DI 自己创建时才会涉及到 DI。"我想这是我的“问题”或我不明白的事情。我使用构造函数手动设置名称和年龄来创建对象。我认为 DI 会向注册的提供者注入其他参数。估计不行。
    • Person 类是不可注入的,因此我没有这个选项。 Person 只是一个具有保存功能的模型类,它需要一个服务——我很想注入它。我想我需要重组课程或以另一种方式获得服务。
    • 如果您将private _service:Service 注入到要创建new Person() 的组件中,那么您可以执行new Person("Mike", 32, this._service)(仍然不确定这是否是您想要将服务传递到的位置不过)。
    【解决方案2】:

    如果我正确理解您要做什么,您需要一家服务工厂。见这里: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]}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 2015-01-31
      相关资源
      最近更新 更多