Toothpick中能否忽略绑定覆盖,复用父作用域实例?
如何在Toothpick子作用域复用父作用域的单例实例
当然可以!默认情况下Toothpick会让子作用域的绑定覆盖父作用域,但你可以通过调整绑定配置,让子作用域复用父作用域中已创建的RepositoryImpl单例实例,具体有两种常用方式:
1. 使用reuseParentScopeInstance()修改子作用域绑定
在子作用域S2的绑定配置中,把原来的singletonInScope()替换为reuseParentScopeInstance()(或在绑定链中添加该方法):
// S2中的绑定配置修改为 bind(Repository.class).to(RepositoryImpl.class).reuseParentScopeInstance();
这个方法会告诉Toothpick:当子作用域需要Repository类型的依赖时,优先去父作用域(这里就是S1)查找已存在的单例实例,不会在子作用域内重新创建新的实例。即使子作用域定义了相同的绑定,也会优先复用父作用域的实例。
2. 移除子作用域的重复绑定(如果允许的话)
如果S2的模块不需要单独定制Repository的绑定逻辑,完全可以不在S2中定义该绑定。此时Toothpick会自动向上查找父作用域S1的绑定,自然就会复用S1中已创建的RepositoryImpl单例实例。不过这种方式只适用于S2不需要独立定制该依赖的场景,如果你必须在S2中显式定义绑定(比如业务需求),那第一种方法更适合。
需要注意的是,reuseParentScopeInstance()的优先级高于singletonInScope(),只要在绑定中声明了这个策略,子作用域就会放弃自己创建实例,转而复用父作用域的实例。
内容的提问来源于stack exchange,提问作者dimsuz
相关产品推荐
相关产品推荐

