Skip to main content

Aware 注入

介绍

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

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

  • UserSessions,连接中所有玩家的管理对象。
  • BrokerClient,与 Broker(游戏网关)通信的对象。

Aware 系列接口

接口名描述
UserSessionsAware框架会调用此方法,将 UserSessions 对象传入
ExternalCoreSettingAware框架会调用此方法,将 ExternalCoreSetting 对象传入
BrokerClientAware框架会调用此方法,将 BrokerClient 对象传入 BrokerClient 是与 Broker(游戏网关)通信的对象

如何使用

在钩子接口中使用

用户上线、下线钩子示例

public class DemoUserHook implements UserHook, UserSessionsAware, BrokerClientAware {
BrokerClient brokerClient;
UserSessions<?, ?> userSessions;
...
@Override
public void setUserSessions(UserSessions<?, ?> userSessions) {
this.userSessions = userSessions;
}

@Override
public void setBrokerClient(BrokerClient brokerClient) {
this.brokerClient = brokerClient;
}
}

在 NettyHandler 中使用

自定义 NettyHandler

我们自定义 YourNettyHandler 类,并实现 UserSessionsAware 接口。

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

SocketUserSessions userSessions;
...

@Override
public void setUserSessions(UserSessions<?, ?> userSessions) {
this.userSessions = (SocketUserSessions) userSessions;
}
}

我们将 YourNettyHandler 添加到游戏对外服

public class Example {
ExternalServer createExternalServer() {
...
DefaultExternalServerBuilder builder = ...
DefaultExternalCoreSetting setting = builder.setting();

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

return builder.build();
}
}
warning

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

更多示例

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