gpt4 book ai didi

java - 谷歌指南 : help to inject

转载 作者:行者123 更新时间:2023-11-29 05:24:35 26 4
gpt4 key购买 nike

我需要一些帮助来使用 guice。我的项目在这里:https://github.com/Romain-P/kalibro/blob/master/realm/src/org/kalibro/core/Main.java

我的问题:我需要在这个 Main.java 中替换 3 个注入(inject)器,只有 1 个注入(inject)器。

我的应用程序是分开的:登录服务器和世界服务器。您只有 1 个 realmServer,以及您想要的一些 WorldServer。

现在,我刚刚创建了 realmServer。在其中你有:- RealmManager(管理玩家 <-> 登录服务器)- ExchangeManager(管理世界 <-> 登录服务器)

他们接受连接,并使用 netty 创建客户。RealmManager 和 ExchangeManager 扩展了 NetworkService。

NetworkService 是一个抽象类,可用于根据需要创建所有管理器。想象一下,如果我稍后想创建与 webServer 通信的 shopManager。

请看代码:https://github.com/Romain-P/kalibro/tree/master/realm/src/org/kalibro/network/netty

现在,我的 Main.java 有 3 个注入(inject)器,但我只需要 1 个。那确实有效!但我认为它没有清洗,所以我只需要 1 个注入(inject)器。

主.java

[...]
Injector exchangeInjector = Guice.createInjector(new ExchangeModule());
Injector realmInjector = Guice.createInjector(new RealmModule());
try {
log.info("initializing exchange");
exchangeInjector.getInstance(ExchangeManager.class).run(config.getExchangePort());
log.info("initializing server");
realmInjector.getInstance(RealmManager.class).run(config.getRealmPort());
} catch(Exception e) {
log.error("Can't start application", +e.getMessage());
System.exit(1);
}

模块:

public class RealmModule extends AbstractModule {
protected void configure() {
install(new NetworkModule());
bind(NetworkService.class).to(RealmManager.class);
}
}
//the same for ExchangeModule..

最佳答案

Guice 注入(inject)器有 ... 数组作为参数:

Guice.createInjector(Module... modules);

所以你可以简单地做:

Guice.createInjector(new ExchangeModule(), new RealmModule());

如果有冲突可以试试binding annotationsuntargetted bindings .

编辑:

这可能会告诉您如何避免冲突:

bind(NetworkService.class).annotatedWith(Exchange.class).to(ExchangeManager.class);
bind(NetworkService.class).annotatedWith(Realm.class).to(RealmManager.class);

然后:

@Inject
@Exchange
private NetworkService exchangeService;

编辑 2:

我认为最大的问题是您启动 NetworkService 的方式。你可以使它成为一个抽象类,然后写这样的东西:

public class ExchangeHandler extends AbstractHandler {
@Inject
ExchangeHandler(@Exchange NetworkService service) {
super(service);
}
}

您希望有 2 个不同的实例,它们使用完全相同的代码,除了获取 NetworkService 实例。有几种方法可以做到这一点,但目前这一种似乎是最具可读性的。或者,您可以考虑使用控制反转来传递您目前需要的 NetworkService,而不是为 ExchangeReaml 管理器创建 2 个不同的对象树。

class ClassUsingManagers {
@Inject
ClassUsingManagers(
@Exchange NetworkService exchangeService,
@Realm NetworkService realmService,
NetworkServiceHandler handler) {
handler.actionForService(exchangeService);
handler.actionForService(realmService);
}
}

或者如果您只想启动它们并运行一个方法(初始化其他所有内容):

Multibinder serviceSet = Multibinder.newSetBinder(binder(), NetworkService.class);
serviceSet.addBinding().asEagerSingleton();

然后:

class ClassUsingManagers {
@Inject
ClassUsingManagers(
Set<NetworkService> services,
NetworkServiceHandler handler) {
for(NetworkService service : services)
handler.actionForService(service);
}
}

其他方法需要您将 Guice Multbinding 插件安装到 Guice。

关于java - 谷歌指南 : help to inject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23172495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com