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 によって提供された例に似ています。ここに関連します)。興味のある方はこちらをご覧ください:

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 に対して null が返されます。例えば:

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