假设我的范围S1
具有带绑定的模块:
bind(Repository.class).to(RepositoryImpl.class).singletonInScope()
然后S2
范围以S1
作为父级S1 -> S2
)打开,S2
定义相同的绑定(因为它是独立的,并且不知道{{1} }):
S1
默认情况下,Toothpick会覆盖父作用域依赖项,因此bind(Repository.class).to(RepositoryImpl.class).singletonInScope()
将创建一个新的S2
。
问题:有没有办法重用RepositoryImpl
中创建的并忽略S1
绑定?
此要求来自以下事实:有时存在独立的应用程序组件,这些组件驻留在不同的范围内并且共享S2
依赖项。他们对彼此一无所知。这些组件也可以按不同的顺序创建,具体取决于场景和用例。
因此,我想要强加的唯一规则是:某个组件(确切地知道哪个组件)创建Repository
,所有这些组件都是在当前和子范围中创建的 - 重用它。
答案 0 :(得分:3)
要在代码中的任何位置获得早期开放范围,您只需使用
即可Scope s1Scope = Toothpick.openScope('s1-scope-name');
如果S1是S2的父作用域,你可以使用getParentScope()方法做同样的事情
Scope s1Scope = s2Scope.getParentScope();
然后只需从S1范围加载所需的单例
Repository s1Repository = s1Scope.getInstance(Repository.class);
如果您想在S2模块中执行此操作,只需执行
即可bind(Repository.class).toProviderInstance(() -> Toothpick.openScope('s1-scope-name').getInstance(Repository.class));
答案 1 :(得分:0)
当您使用Toothpick开发由多个独立组件构建的应用时,您可能会朝着这个方向发展:
每个独立组件都应拥有2个牙签模块。
在第二个中,您将定义输入和输出依存关系,它们将与其他独立组件连接在一起,以最终构建一个集成的componenet系统。