我对 Google Guice 很陌生,我在获取 UserService 实例时遇到了麻烦。在我的 Playframework 应用程序中,我有一个名为 UserService 的服务,如下所示:
public class UserService { // Note it doesn't implement an interface
private UserDao userDao;
private Email email;
@Inject
public UserService(UserDao userDao, Email email) {
this.userDao = userDao;
this.email = email;
}
...
}
我有这个控制器:
public class UserController extends Controller {
@Inject
private UserService userService;
...
}
configure()
我的 UserModule有这个定义:
protected void configure() {
bind(UserDao.class).to(UserDaoJpa.class);
bind(Email.class).to(EmailHtml.class);
bind(UserController.class);
}
我在 Playframework Global 对象上得到了注入器,它看起来类似于 Guillaume Bort 提供的关于获取控制器实例的示例,在这种情况下,它非常适合获取注入器(getControllerInstance 方法是 Play 2.1 中的新功能,但这不是此处相关)。有兴趣可以看这里:
public class Global extends GlobalSettings {
private static final Injector injector = createInjector();
@Override
public <A> A getControllerInstance(Class<A> controllerClass) throws Exception {
return injector.getInstance(controllerClass);
}
private static Injector createInjector() {
return Guice.createInjector(new UsuarioModule());
}
}
此时,一切正常,服务已正确实例化,其参数已解析。控制器按预期获取对象图。但是,当我尝试@Inject UserService userService
在应用程序中的其他位置执行操作时,userService 会为空。例如:
public class EmailAvailableValidator {
@Inject
private static UserService userService; // This is not resolved :(
public static Map<String, List<ValidationError>> validateEmailAndGetErrorsIfAny(String email, String emailField) {
Map<String, List<ValidationError>> errors = new HashMap<String, List<ValidationError>>();
if (!userService.isEmailAvailable(email)) {
List<ValidationError> list = new ArrayList<ValidationError>();
list.add(new ValidationError("", UsuarioResource.getMessageEmailTaken()));
errors.put(emailField, list);
}
return errors;
}
}
问题是,获取未实现接口的对象实例的正确方法是什么?是否总是需要实现接口?不是说guice知道如何解决UserDao和Email吗?为什么除了在 UserController 中它不能实例化它?我需要这个实例解决了它的依赖关系,我的意思是使用 UserDao 和 Email。
官方的 guice 文档对我来说不是很有帮助。
谢谢你的帮助!