我有一个奇怪的要求。我们的应用程序是“single-spa”应用程序。其中,容器应用程序将为我们提供左侧的导航菜单(树视图),我们将创建模块和组件的新实例,并根据用户选择的导航项加载它。 我们正在引入一项称为多站点的新功能,其中用户可以使用单个 UI 连接到多个数据库。因此,现在左侧导航将显示可用的站点,当他展开站点时,将加载导航项目列表。当用户单击某个项目时,我们将创建该组件的一个实例并将其呈现给用户。对于组件,为每个站点创建多个实例是由 Angular DI 本身完成的,因为我们将在选项卡中打开每个组件。 siteId 将在创建实例时注入到组件中。
问题出在服务上。由于我们可以将数据和业务逻辑放入可观察对象等中,因此我需要为每个站点创建同一服务的不同实例。
有没有一种方法,我可以为每个站点创建多个实例,然后在组件中使用?
目前,我为每个服务创建了一个简单的 ServiceManger,其中包含一个
getInstance
方法,如果服务不存在,该方法将为该服务创建一个实例并将其发送回来。
@Injectable({ providedIn: 'root' })
// Maintains instances of family service
export class TestServiceManager {
private readonly api = inject(TestApi);
private readonly stateInstances = new Map<string, TestServiceManager>();
/**
* Gets an instance stored with instanceName param
* @param instanceName
*/
getInstance(instanceName: string): TestService {
if (!this.stateInstances.has(instanceName)) {
this.stateInstances.set(instanceName, new TestService(this.api));
}
return this.stateInstances.get(instanceName) as TestService;
}
}
在组件中,我将注入 TestServiceManager 而不是 TestService,并且我将按如下方式访问服务。
this.testServiceManager.getInstance(this.siteId)
我不喜欢这个有几个原因。
我不喜欢必须为每个服务创建一个服务管理器。
有没有更好的方法来实现这一目标?我想看看是否可以让 Angular 负责基于某些自定义提供程序或其他内容为每个站点创建不同的服务实例。
如果没有,我们可以改进这一点并创建一个通用的 ServiceManager 类,使用它我不需要为每个服务创建一个新的 ServiceManager 。