我正在围绕SignalR创建一个包装程序,以实现游戏的连接和整个交互
interface IGameConnection {
connect(): Promise<void>;
join(): Promise<void>;
leave(): Promise<void>;
}
interface IGameEvents {
onJoin(player: any): void;
onLeave(player: any): void;
}
class GameConnection implements IGameConnection {
protected connection: HubConnection;
constructor(gameEvents: IGameEvents) {
this.connection = new HubConnectionBuilder()
.withUrl("http://localhost:5000/hubs/game")
.configureLogging(LogLevel.Information)
.build();
this.connection.on('PlayerJoin', gameEvents.onJoin);
this.connection.on('PlayerLeave', gameEvents.onLeave);
}
async connect(): Promise<void> {
await this.connection.start();
}
async join(): Promise<void> {
await this.connection.invoke("Join");
}
async leave(): Promise<void> {
await this.connection.invoke("Leave");
}
}
为来自中心的消息设置事件侦听器的最佳方法是什么,特别是要牢记以下几点:
最佳做法是,之后,在HubConnection上调用start方法 上。这样可以确保您的处理程序在任何消息之前都已注册 收到。
我将采用某种结构,使代码以某种方式迫使用户实施特定事件,因为如果在接口IGameConnection
界面上定义它们,则用户可以在订阅所有事件之前轻松地调用connect
(请记住,可能会有很多事件)。
我当前的想法是通过构造函数强制执行此操作(请参见IGameEvents
及其在GameConnection
中的用法-如果不通过所有事件处理程序的实现,基本上就不能创建连接实例)
有没有更好的方法来构造此代码?