吉斯對於第一種方法提供工廠幫手叫Assisted Inject
但是,有可能與Custom scopes做得更好。
這個想法是seed
對象注入依賴於提供者的參數。
它看起來像:
模塊:
bind(CommandProperty.class).toProvider(ExchangeScope.<CommandProperty>seededKeyProvider()).in(ExchangeScope.class); //<< this is missing in tutorial
作用域代碼:
scope.enter();
try {
// explicitly seed some seed objects...
scope.seed(Key.get(CommandProperty.class), commandPropertyInstance);
// create and access scoped objects
runnable.run();
} finally {
scope.exit();
}
提供者:
private Provider<CommandProperty> commandPropertyProvider;
private Map<CommandProperty, Provider<Object>> objectProviderMap;
@Inject
public ObjectProvider(Provider<CommandProperty> commandPropertyProvider, Map<CommandProperty, Provider<Object>> objectProviderMap) {
this.commandPropertyProvider = commandPropertyProvider;
this.objectProviderMap = objectProviderMap;
}
@Override
public CommandProperty get() {
CommandProperty commandP = commandPropertyProvider.get();
return objectProviderMap.get(commandP).get();
}
正如你可以看到objectProviderMap
會在運行時期間可以注入。不同的是你擺脫了工廠,你可以創建對象的構造/設置方式。垮臺是你必須維護更大的代碼複雜性。我寧願使用它的代碼庫而不是應用程序級別的核心或框架。
我想避免將我的課程介紹給提供者的概念(如果可能) – preslavrachev
那麼,我無法想象如何去做。工廠是唯一的選擇。 –