0

我对 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 文档对我来说不是很有帮助。

谢谢你的帮助!

4

1 回答 1

0

两件事情:

  1. 您需要使用 Guice Injector 来实例化 EmailAvailableValidator。您的“全球”课程已经在这样做了。使用注入器创建一个实例,然后设置它的所有注入字段。

  2. 您可能必须使用静态注入来填充静态字段。例如,在您的 configure() 方法中添加:

    requestStaticInjection(UserService.class);
    

    但是,我没有亲自使用它,所以 YMMV。

参考:

http://code.google.com/p/google-guice/wiki/Injections

于 2013-07-23T03:21:17.987 回答