【发布时间】:2017-11-07 13:13:04
【问题描述】:
我对 Guice 还比较陌生,有些事情仍然让我很难受。 我的特别问题是,您如何处理 Guice 中的嵌套注入。 示例:
A类通过@Inject使用B类,B类使用C类。
明确:
我绑定到提供程序的模块。
public class ModuleBinder extends AbstractModule {
@Override
protected void configure() {
bind(DatabaseControllerInterface.class)
.toProvider(DatabaseControllerProvider.class).asEagerSingleton();
bind(AnalyzerInterface.class)
.toProvider(AnalyzerProvider.class).asEagerSingleton();
bind(SystemAdministrationInterface.class)
.toProvider(SystemAdministrationProvider.class).asEagerSingleton();
bind(LogInServiceInterface.class)
.toProvider(LogInServiceProvider.class);
}
}
DatabaseControllerProvider:
public class DatabaseControllerProvider implements Provider<DatabaseControllerInterface> {
@Override
public DatabaseControllerInterface get() {
return new DatabaseControllerImpl();
}
}
LogInServiceProvider:
public class LogInServiceProvider implements Provider<LogInServiceInterface> {
@Override
public LogInServiceInterface get() {
return new LogInServiceImpl();
}
}
最后,LogInService 使用:
public class LogInServiceImpl implements LogInServiceInterface{
@Inject
private DatabaseControllerProvider databaseControllerProvider;
private final DatabaseControllerInterface databaseController;
public LogInServiceImpl() {
this.databaseController = databaseControllerProvider.get();
}
@Override
public User register(final String mail, final String userName, final String password) {
databaseController.registerUser(userName, mail, password, UserRole.ADMIN);
}
}
然后调用是:
public class Test() {
public static test() {
final Injector injector = Guice.createInjector(new ModuleBinder());
logInService = injector.getInstance(LogInServiceInterface.class);
logInService.registerUser("test", "test", "test");
}
}
我知道你们中的大多数人都会厌倦该代码,但是,嘿,我是 Guice 的初学者,所以请对我温柔一点。
我想使用构造函数注入,我已经意识到字段注入被认为是“邪恶的”。您是否知道如何通过保留提供者(我需要它们)来使其正常工作?
使用示例中的注入在“第二”级别上没有任何作用,LogInServiceImpl 中的DatabaseControllerImpl 是null。
我是不是配置有问题?我是否误解了提供和/或模块的用法?
我希望有人可以并且愿意帮助我。如果您需要更多信息,请发表评论。
致以最诚挚的问候,
约瑟夫背包
【问题讨论】:
标签: dependency-injection guice