Skip to main content

Aware

介绍

框架目前还没有 DI 特性 ,因此无法实现将一些对象注入到其他对象属性中,但框架提供了 Aware 的方式来支持类似的功能。

ExternalSettingAware

在我们扩展一些自定义 NettyHandler 或心跳与用户钩子接口时,可以通过 Aware 特性来获取

  • UserSessions,连接中所有玩家的管理对象。
  • Server 对外服信息。
  • ConvenientCommunication 便捷通信对象。
public interface ExternalSettingAware {
void setExternalSetting(ExternalSetting setting);
}

实现 ExternalSettingAware 接口后,框架会自动调用 setExternalSetting 方法。

如何使用

用户上线、下线钩子示例

  • code 7: 获取 UserSessions
  • code 8: 获取 ConvenientCommunication
public final class MyUserHook implements UserHook,
ExternalSettingAware
{
UserSessions<?, ?> userSessions;
ConvenientCommunication convenientCommunication;

@Override
public void setExternalSetting(ExternalSetting setting) {
this.userSessions = setting.userSessions();
this.convenientCommunication = setting.convenientCommunication();
}
...
}

自定义 NettyHandler

@ChannelHandler.Sharable
public final class YourNettyHandler extends ChannelInboundHandlerAdapter
implements ExternalSettingAware
{

SocketUserSessions userSessions;
...

@Override
public void setExternalSetting(ExternalSetting setting) {
this.userSessions = setting.userSessions();
this.convenientCommunication = setting.convenientCommunication();
}
}

我们将 YourNettyHandler 添加到对外服

private static ExternalServer ofExternalServer() {
var externalServerBuilder = MyExternalServer.builder(ExternalGlobalConfig.externalPort, ExternalJoinEnum.WEBSOCKET);

externalServerBuilder.setMicroBootstrapFlow(new WebSocketMicroBootstrapFlow(){
@Override
public void pipelineCustom(PipelineContext context) {
super.pipelineCustom(context);
context.addLast("YourNettyHandler", new YourNettyHandler());
}
});

return externalServerBuilder.build();
}
warning

一定要使用 context.addLast 来添加 NettyHandler,否则 Aware 无法注入。

更多示例

请参考内置与可选的 Handler 的实现类源码。