Angular:没有@Injectable装饰器的注入类

时间:2019-07-22 16:11:55

标签: angular

我有一些来自图书馆的课程,例如:

class Foo {
   // ...
}
class Bar {
   constructor(private foo: Foo) { }
   // ...
}

这些类没有@Injectable装饰器,因为该库不是特定于Angular的。但是,我想在我的应用程序中将它们用作服务。

到目前为止,我的解决方案是创建派生类,例如:

@Injectable()
class InjectableFoo extend Foo {
  constructor() { super(); }
}
@Injectable()
class InjectableBar extends Bar {
  constructor(foo: InjectableFoo) {
    super(foo);
  }
}

我对这种解决方案并不感到兴奋,因为它需要额外的样板代码,这些代码没有任何实际价值,并且在组件中使用这些服务的人员必须知道使用“可注入”版本而不是(更简单)的基类。在一个完美的世界中,我希望能够告诉Angular FooBar应该是可注射的。

这可能吗?

2 个答案:

答案 0 :(得分:1)

您可以使用工厂提供者和值提供者在NgModule中提供它们。

https://angular.io/api/core/FactoryProvider

https://angular.io/api/core/ValueProvider

class Foo {
   // ...
}
class Bar {
   constructor(private foo: Foo) { }
   // ...
}

@NgModule({
   providers: [
      {provide: Foo, useValue: new Foo()},
      {provide: Bar, useFactory: (foo) => new Bar(foo), deps: [Foo]}
   ]
});

在上面的示例中,您可以使用useValue: new Foo(),但是这里的关键是deps: [Foo]允许您将foo注入Bar的工厂函数中,因为它是依赖性。

稍后,您只需执行以下操作即可。

@Component({...})
export class MyComponent {
    constructor(foo: Foo, bar: Bar) { }
}

答案 1 :(得分:0)

在您的@NgModule()的{​​{1}}类装饰器中提供它:

app.module

这将允许Angular Dependecy Injector看到那些类(在将它们注入其他组件时也使它们成为单例)

然后像其他服务一样注入

@NgModule({
 ...Others Imports/Declare
 providers: [ Foo, Bar ]
})
相关问题