我有一些来自图书馆的课程,例如:
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
应该是可注射的。
这可能吗?
答案 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 ]
})