gpt4 book ai didi

java - 如何在guice中进行依赖I/O

转载 作者:行者123 更新时间:2023-12-02 15:38:03 24 4
gpt4 key购买 nike

Guice guidance on side-effects in modules基本上是“不要这样做”。与 I/O in Providers 相同,我假设它包含模块。然后,他们给出了一个使用服务接口(interface)的空白示例,该接口(interface)以正确的顺序启动其服务。

Injector injector = Guice.createInjector(
new DatabaseModule(),
new WebserverModule(),
...
);

Service databaseConnectionPool = injector.getInstance(
Key.get(Service.class, DatabaseService.class));
databaseConnectionPool.start();
addShutdownHook(databaseConnectionPool);

Service webserver = injector.getInstance(
Key.get(Service.class, WebserverService.class));
webserver.start();
addShutdownHook(webserver);

但在现实世界中,网络服务器间接依赖于数据库。更重要的是,获得DataSource的唯一途径就是连接数据库。在网络服务器和数据库之间有几个抽象层,所有这些都希望注入(inject)它们的依赖项并启动它们的服务。

我考虑了两种不同的选择来处理这种情况。首先是使用guice的服务,但是注入(inject)Provider<DataSource> s 或同等内容。但这会泄露我的代码,因为现在所有内容都使用 Provider<LayerBelow>而不是实际的LayerBelow

我尝试的第二种方法是链接创建注入(inject)器,其中我为每层构建一个子注入(inject)器,启动该层,然后使用它为下一层创建子注入(inject)器。这看起来也很笨拙。像这样:

// I/O in the static method call; returns a module with
// the environment-based objects
EnvironmentModule environment = EnvironmentModule.configureEnvironment(args);

Injector injector = Guice.createInjector(
environment,
// the following connects to the database, and returns a module
// providing the DataSource
SQLModule.connectToDatabase());

injector = injector.createChildInjector(new BusinessLayerModule());
startTimers(injector);

injector = injector.createChildInjector(
new ServicesModule(),
new WebServerModule());

startServer(injector);

是否有更好的方法在启动期间执行 I/O 和副作用?我正在使用 Guice 4

相关问题:

最佳答案

我的方法与您的第二种方法类似,除了子注入(inject)器之外。

首先,创建一个专门用于初始化的模块 SQLModule :

Injector initInjector = Guice.createInjector(Stage.PRODUCTION, new SQLModule());
SQLService service = initInjector.getInstance(SQLService.class);
Properties initProps = service.doInit(); // for example

然后创建主模块:

Injector mainInjector = Guice.createInjector(Stage.PRODUCTION, 
new SQLModule(),
new MainModule(initProps));
// main program here using the mainInjector

关于java - 如何在guice中进行依赖I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32417070/

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