9

假设我有S1具有绑定模块的范围:

bind(Repository.class).to(RepositoryImpl.class).singletonInScope()

然后S2范围S1作为父 ( S1 -> S2) 打开并S2定义相同的绑定(因为它是独立的并且一无所知S1):

bind(Repository.class).to(RepositoryImpl.class).singletonInScope()

默认情况下,Toothpick 会覆盖父范围依赖项,因此S2RepositoryImpl创建一个新的。

问题:有没有办法重用创建的S1并忽略S2绑定?

这个要求来自这样一个事实,即有时存在独立的应用程序组件,它们驻留在不同的范围内并且共享该Repository依赖关系。他们彼此一无所知。这些组件也可以根据场景和用例以不同的顺序创建。

所以我要强加的唯一规则是:某个组件(确切地不知道是哪个)创建Repository的,所有这些都是稍后在当前子范围中创建的——重用它。

4

2 回答 2

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));
于 2018-05-17T21:33:12.437 回答
0

当您使用 Toothpick 开发由多个独立组件构建的应用程序时,您可能会朝这个方向发展:

每个独立的组件,应该拥有 2 个牙签模块。

  • 一个处理内部依赖关系的模块(由模块本身提供)
  • 一个处理外部依赖项的模块(在集成级别提供)

在第二个中,您将定义输入和输出依赖项,这些依赖项将连接到其他独立组件,最终构建一个集成的组件系统。

于 2020-11-05T18:28:13.300 回答