guice辅助注射

时间:2011-09-06 21:35:58

标签: guice

我有一个带有参数化构造函数的类,使用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()调用的一部分传递。

我已经考虑过各种解决方案,但似乎没有一个理想:

  • 注入PortfolioProvider - 但提供者如何获得访问权限 投资组合?
  • 针对登录用户将组合保存在Handler中 (我使用appengine),然后使用登录用户在a中检索 提供者 - 但我希望系统能够处理匿名 用户
  • 将投资组合存储在静态ThreadLocal中,访问a 再次提供者 - 似乎非常笨重

如果有人可以帮助我,我会非常感激吗?我是Guice的新手,希望我能错过一些明显的东西...

谢谢, 标记

2 个答案:

答案 0 :(得分:0)

ThreadLocal实际上可能是您最好的选择。看一下SimpleScope,它使用ThreadLocals为一段代码的主体创建一个可注入的值。如果您已经在使用Guice的servlet集成,则需要编写ServletFilter来进入和退出SimpleScope

答案 1 :(得分:0)

是否可以将Portfolio作为其他需要它的方法的参数?例如,不是portfolioStrategy类的私有成员,而是让它成为执行参数?这取决于你猜你需要多少个不同的地方。

public class Strategy {
    @Inject
    public Strategy(QuoteDao dao, ??) {...}
    public execute(Portfolio portfolio);
}

我发现有时候将数据对象传递给策略类允许策略本身就是线程安全的,因为它们包含逻辑但没有自己的可变数据。这允许它们更多地用作单身。