有没有办法忽略Toothpick中的绑定覆盖?

时间:2018-03-21 17:25:33

标签: java android dependency-injection toothpick-di

假设我的范围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,所有这些组件都是在当前子范围中创建的 - 重用它。

2 个答案:

答案 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系统。