使用Guice进行范围传播

时间:2015-05-06 16:37:24

标签: java dependency-injection scope cdi guice

我有一个类,每个请求(在我的示例中为dbSession)和其他一些使用每个请求对象的实例的类应该为其创建(和销毁)实例。像这样:

webservice --> repository --> dao --> dbSession

( - >表示使用)

但是我有一个类似的用例,但dbsession不应该绑定到请求。像这样:

webservice --> otherService --> repository --> dao --> dbSession

目前dbSession类已绑定到请求。要实现其他用例,db会话不能是请求绑定。我可以使用限定符来执行此操作,但之后我必须为两个范围复制一堆(必需的)提供程序方法。

所以,我正在寻找另一种解决方案。是否可以传播范围?我的意思是依赖关系注入注入目标范围的对象?

@request webservice --> @myScope otherService --> @myScope repository --> @myScope dao --> @myScope dbSession

在示例中,otherService的所有依赖项应与otherService在同一范围内(对otherService的调用是异步的)。

Guice可以这样吗?只是出于好奇:CDI会有可能吗?

1 个答案:

答案 0 :(得分:0)

我理解正确吗?

第一种情况:

@Request webservice --> @Singleton repository --> @Singleton dao --> @Request dbSession

你在第二种情况下寻找的是什么:

@request webservice --> @myScope/@Singleton otherService --> @myScope/@Singleton repository --> @myScope/@Singleton dao --> @myScope/@noscope_session_per_query dbSession

我建议您将存储库封装到PrivateModuleexposerepositoryotherService接口。然后绑定在两个模块dbSession(这意味着EntityManager?)?提供者在不同的范围内。当你开始混合范围时,不要忘记使用Provider<T>而不是直接注入。

第二个选项是使用dbSession / EntityManager提供程序绑定的注释并使用适当的注释注入它。