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模块/提供者找到合适的位置来获得令人满意的实例。