角度:在没有装饰器的情况下注入类@Injectable



我有一些来自库的类,例如。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,FooBar应该是可注射的。

这可能吗?

可以使用

工厂提供程序和值提供程序在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){}
  ...
}

相关内容

最新更新