我有一个用于外部聊天Sdk的适配器类(ChatSdkAdapter)。Chat SDK作为NPM包不可用,因此通过脚本标记使用注入加载到文档中。一旦加载并初始化了它,就可以从window对象访问它:window.ChatSdk.login().
ChatSdkAdapter类包含登录、sendMessage.等方法,所有都依赖于window.ChatSdk API的可用性。
选择哪种方法来解决适配器和SDK之间的耦合?
方法1:在适配器中公开方法getInstance,它总是返回适配器的同一个实例,但在此之前,检查window.ChatSdk是否可用(如果没有,则返回一个错误)。但是,如果在创建实例之后删除(卸载) window.ChatSdk会发生什么?
方法2:添加一个检查ChatSdk是否在适配器的每个方法(EnsureChatSdkAvailable())中可用,作为第一行
其中哪一种更可取,是否有更好的方法?
提前谢谢你。
发布于 2022-03-22 23:45:46
两者都有。使用类方法中的安全getInstance()调用window.ChatSDK并检索它。这样,使用chat的每一种方法都会在SDK不存在的情况下正确地出错。
# pseudocode
Class ChatAdapter {
private chat: ChatSDK
private function initChat(): void {
# what ever you need to do to initialize your chat sdk
# or error if you cant
this.chat = window.ChatSDK
}
private function getChatInstance(): ChatSDK {
if (this.chat ==== undefined) {
this.initChat()
}
return this.chat
}
public function doSomething (): void {
this.getChatInstance().doSomething()
}
}本质上,您正在执行的是单例模式,其中有一个单独的实例化,该实例化被保存在内存中,用于调用适配器的所有实例。此外,您还会注意到,我放置了init函数,因为我认为,当您第一次“需要”chat sdk时,它更倾向于初始化,但是如果由于某些原因无法控制init,那么您可能会出错。
https://stackoverflow.com/questions/71579111
复制相似问题