我有一些来自库的类,例如。g.:
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,Foo
和Bar
应该是可注射的。
这可能吗?
工厂提供程序和值提供程序在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) { }
}
在app.module
的@NgModule()
类装饰器中提供它:
@NgModule({
...Others Imports/Declare
providers: [ Foo, Bar ]
})
这将允许 Angular 依赖注入器看到这些类(当它们注入到其他组件时,也使它们成为单例(
然后像其他服务一样注入它
export class YourComponent{
constructor(private fooInstace: Foo){}
...
}