角度库模块注入抽象类的相同服务实例



我正在用Angular 11构建一个库和示例应用程序。我希望允许消费应用程序将基类的实现注入库中。我在库中定义了默认逻辑。我将消费应用程序中的提供商定义为:

// app.module.ts in the root application
providers: [
{
provide: 'MyServiceBase',
useClass: DefaultMyService
}
]

我正在库中定义基类:

export abstract class MyServiceBase{
abstract myFunction();
}

我在库中定义了默认逻辑:

@Injectable({
providedIn: 'root',
})
export class DefaultMyService extends MyServiceBase {
...
}

我将服务注入库中的一个组件,并将一个组件注入特定类:

constructor(@Inject('MyServiceBase') private myService: MyServiceBase) {
...
}

我遇到的问题是,注入消费应用程序的DefaultMyService实例与库不同。当我调试应用程序时,从消费应用程序中使用的代码引用了库导出的javascript,其中从库中使用的编码实际上是typescript。

是否可以将相同的实例注入库和消费应用程序?

我发现了这个问题。我忽略了我图书馆的服务是如何初始化的。它不应该有Inject令牌,它没有注入依赖项。初始化类正在向它传递MyServiceBase类的实例。初始化该对象的类正在使用依赖项注入,而它没有使用令牌。我把它改为使用代币,效果很好。

编辑-

在我的案例中,我希望一个组件拥有自己的类实例(下面是myNonDepInjectObj(,因为我希望在页面上与该组件的多个实例保持分离。然而,我想使用一个在该对象中注入depdency的服务。例如,这里是使用令牌的正确代码:

export class MyComponent implements OnInit {
constructor(@Inject('MyBaseService') myService: MyBaseService) {
const myNonDepInjectedObj = new MyObj(myService);
}
}

那么obj类定义的正确代码:

export class MyObj {
constructor(myService: MyBaseService){
}
}

最新更新