我有一个带有参数化构造函数的类,使用AssistedInject,如下所示:
@Inject
Portfolio (QuoteDao dao, @Assisted Params params) {...}
我在命令处理servlet中创建了这个类的实例:
public class Handler {
@Inject Strategy strategy;
Result execute(Action action) {
Portfolio portfolio = portfolioFactory.create(action.params);
strategy.execute();
}
}
当我需要在系统的其他组件中获得对项目组合的引用时,我的不确定性就开始了。理想情况下,我将它作为构造函数的一部分包含在内,但由于它在注射时不可用,所以这是不可能的。
public class Strategy {
Portfolio portfolio; <-- how should I get this here?
@Inject
public Strategy(QuoteDao dao, ??) {...}
public execute();
}
这个例子有点简化 - 不能简单地将投资组合作为execute()调用的一部分传递。
我已经考虑过各种解决方案,但似乎没有一个理想:
如果有人可以帮助我,我会非常感激吗?我是Guice的新手,希望我能错过一些明显的东西...
谢谢, 标记
答案 0 :(得分:0)
ThreadLocal
实际上可能是您最好的选择。看一下SimpleScope,它使用ThreadLocals为一段代码的主体创建一个可注入的值。如果您已经在使用Guice的servlet集成,则需要编写ServletFilter
来进入和退出SimpleScope
。
答案 1 :(得分:0)
是否可以将Portfolio
作为其他需要它的方法的参数?例如,不是portfolio
是Strategy
类的私有成员,而是让它成为执行参数?这取决于你猜你需要多少个不同的地方。
public class Strategy {
@Inject
public Strategy(QuoteDao dao, ??) {...}
public execute(Portfolio portfolio);
}
我发现有时候将数据对象传递给策略类允许策略本身就是线程安全的,因为它们包含逻辑但没有自己的可变数据。这允许它们更多地用作单身。