工厂提供商可以选择依赖吗?

Krz*_*dan 10 dependency-injection typescript angular

例如:

@NgModule ({
  providers: [ 
    { provide: MyService, 
      useFactory: (optionalDep) => new MyService(optionalDep)
      deps: [SOME_DEP]
    }
})
class MyModule {}
Run Code Online (Sandbox Code Playgroud)

useFactory可以有可选的依赖吗?

max*_*992 14

根据官方文档,您可以执行以下操作:

const Location = new InjectionToken('location');
const Hash = new InjectionToken('hash');

const injector = Injector.create([{
  provide: Hash,
  useFactory: (location: string) => `Hash for: ${location}`,
  // use a nested array to define metadata for dependencies.
  deps: [[new Optional(), Location]]
}]);

expect(injector.get(Hash)).toEqual('Hash for: null');
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅https://angular.io/api/core/FactoryProvider#example


Krz*_*dan 6

我发现了这样一种解决方法:

class OptionalDepHolder {
  constructor(@Optional() @Inject(SOME_DEP) public optionalDep) {}
}

@NgModule ({
  providers: [ 
    { provide: MyService, 
      useFactory: (holder) => new MyService(holder.optionalDep)
      deps: [OptionalDepHolder]
    }
})
class MyModule {}
Run Code Online (Sandbox Code Playgroud)


Shl*_*saf 0

工厂接受一个函数。

Typescript 中的装饰器可以应用于:类声明、方法、访问器、属性或参数。

换句话说,目前你只能装饰一个类和类成员。

参数是指方法的参数,而不是函数的参数。

因此,由于您无法装饰函数以及函数中的参数,因此您无法设置 @Optional 标记。

这是一种语言/规范限制,将来可能会改变。

另一件需要注意的事情是,打字稿支持的元数据功能和使用反射元数据的角度使用的元数据功能被设计为在类上工作。这当然是废话,类就是函数……但这就是一般的思维模型。

根据文档, deps 数组接受提供者令牌,这意味着您无法暗示依赖项是可选的。

在工厂中支持可选依赖项是一个好主意。您应该打开 GH 问题并提出功能请求!