Guice - 如何在不同的范围内以不同的方式提供相同的密钥?

时间:2014-12-16 17:31:38

标签: java guice guice-servlet

Guice用户!我有一个情况,我可以找到一个解决方法,但我对我的解决方案不满意。它与Using the provider from two different scopes非常相似,但那里的答案并不适合我的情况。

我有一个这样的课程,我在很多地方注入了这个课程:

MyBusinessClass {
    @Inject
    MyBusinessClass(@AuthenticatedUser User user) {};
}

在过去的某个时刻,我刚刚从网络会话中获得@AuthenticatedUser User,所以我有:

bind(User.class).annotatedWith(AuthenticatedUser.class).toProvider(new AuthenticatedUserProvider());
...
public static class AuthenticatedUserProvider implements Provider<User> {
    @Inject
    Provider<Session> session;
    public User get() {
        return SessionUtil.getUserFromSession(session.get());
    }
}

问题:

这很有用,直到我需要在不同的Guice范围内使用相同的MyBusinessClass(并且在请求范围之外)。我创建了一个JobScope,非常类似于Guice文档中的范围示例,创建了一种JobSession,将其绑定到JobScope,并在JobSession中使用@AuthenticatedUser User时放置我要注入的MyBusinessClass实例

我不为自己所做的事感到骄傲......我已经改善了#34;我的提供商试图为所有范围提供@AuthenticatedUser User,我最终得到了这个丑陋的提供者:

public static class AuthenticatedUserProvider implements Provider<User> {
    @com.google.inject.Inject(optional=true)
    Provider<Session> session;
    @com.google.inject.Inject(optional=true)
    Provider<JobSession> jobSession;
    @Override
    public User get() {
        try {
            return SessionUtil.getUserFromSession(session.get());
        } catch (Exception e) {
            try {
                return SessionUtil.getUserFromJobSession(jobSession.get());
            } catch (Exception ee) {
                throw new IllegalStateException("Current scope doesn't have a auth user!");
            }
        }
    }
}

提供程序执行尝试错误的方法来查找哪个会话(Web会话或作业会话)可用,并返回用户获取的第一个会话。它起作用的原因是@com.google.inject.Inject(optional=true),也因为范围是互斥的。

有没有更好的方法来实现这一目标?我只想让MyBusinessClass@AuthenticatedUser User注入透明使用的任何范围,让Guice模块/提供者找到合适的位置来获得令人满意的实例。

0 个答案:

没有答案