作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我有作用域 S1
,其中包含带有绑定(bind)的模块:
bind(Repository.class).to(RepositoryImpl.class).singletonInScope()
然后 S2
作用域以 S1
作为父级(S1 -> S2
)打开,S2
定义相同的绑定(bind)(因为它是独立的并且对 S1
一无所知):
bind(Repository.class).to(RepositoryImpl.class).singletonInScope()
默认情况下,Toothpick 会覆盖父范围依赖项,因此 S2
将创建一个新的 RepositoryImpl
。
问题:有没有办法重用在 S1
中创建的绑定(bind)并忽略 S2
绑定(bind)?
此要求来自这样一个事实,即有时存在独立 应用程序组件,它们驻留在不同的范围内并且共享Repository
依赖项。他们彼此一无所知。这些组件也可以按不同的顺序创建,具体取决于场景和用例。
所以我想强加的唯一规则是:某些组件(不知 Prop 体是哪个组件)创建了 Repository
,所有这些都是稍后在当前 和 中创建的子作用域 - 重用它。
最佳答案
要在代码中的任何位置尽早打开作用域,您只需使用
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));
关于java - 有没有办法忽略 Toothpick 中的绑定(bind)覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49412905/
我是一名优秀的程序员,十分优秀!