Angular 4/5 - 使用动态配置实例化服务

Angular 4/5 - Instantiate service with dynamic configuration

我目前正在编写一个公开 AuthModule 的库,其中包含一个 AuthService 用于使用 oidc-client-js 处理 OAuth2 身份验证。但是,我希望消费应用程序指定 OAuth 客户端的配置。我知道我可以将配置传递给 AuthModuleforRoot 方法,如下所示:

AuthModule.forRoot({
    applicationNamespace: 'ConsumingApp',
    clientId: 'consuming.app'
});

forRoot 方法中,我想提供一个带有传入配置的服务实例。

我已经设法通过在 window 对象上设置传入的属性来破解它。然后我在 AuthService.

中使用对 window.clientIdwindow.applicationNamespace 的引用
(window as any).applicationNamespace = authConfig.applicationNamespace;
(window as any).clientId = authConfig.clientId;

有没有更好的方法来完成这个?

这可以使用注入令牌通过以下方式完成。

第 1 步:为传入的配置对象创建一个 InjectionToken,如下所示:

export const AUTH_CONFIG = new InjectionToken<AuthConfig>('authConfig');

第 2 步: 将令牌注入 AuthService 构造函数

第 3 步:将配置对象传递到模块的 forRoot 函数中

public static forRoot(authConfig: AuthConfig): ModuleWithProviders

第 4 步:使用传入的配置作为注入令牌的值

{ provide: AUTH_CONFIG, useValue: authConfig }