Я уже некоторое время использую guice, но недостаточно, чтобы выяснить, как выполнить то, что я хочу в этом случае. Мне кажется, что мне нужна комбинация AssistedInject
, Throwing Providers
и Multibindings
, но я не уверен, как собрать все это вместе. Это сбитый код, который не совсем работает. Он должен быть Guicier!Именованные, метательные провайдеры инжектированных объектов
public class Utilities {
public static String expensiveLookup(String key) throws IOException {...}
}
public class Helper {
@Inject private InjectedClass injectedValue;
public Helper(String value1, String value2, String value3) {...}
}
public class Workhorse {
// This map isn't very guicy. I'd prefer named bindings, or a multibinding
private static Map<String, Helper> helpers = new HashMap();
public static void register(String name, Helper helper) {
helpers.put(name, helper);
}
////////
@Inject lots of things
public void doHardWork(String helperName) {
Helper helper = helpers.get(helperName);
// do something hard
}
}
class UserModule extends AbstractModule {
protected void configure() {
// Helpers are created with `new`, so they don't get `injectedValue`
Workhorse.register("cheap helper", new Helper("cheap value", ...));
try {
// This expensive lookup should be delay until needed
String expensiveValue = Utilities.expensiveLookup("expensive key");
Workhorse.register("expensive helper", new Helper(expensiveValue, ...));
} catch (IOException ex) {
// This exception should be handled in `doHardwork()`
}
}
}
Я могу понять, как решить любые 2 из проблем сразу, но не все 4:
Helper
сек должны быть созданы с Guice, неnew
expensiveLookup
должны быть задерживается, пока не потребуетсяIOException
должны быть перехвачены и обработаныdoHardWork
helpers
, вероятно, следует заменить на именованные привязки или многосвязную. Это не сложно для меня, но это кажется правильным.
Может кто-нибудь предложить какие-то намеки?
Что такое value2 и value3 в вспомогательном конструкторе? это те значения, которые вы просматриваете с помощью ключа? или они произвольны во время выполнения? –
Эти параметры также указаны в 'UserModule', но являются только строками. Нет необходимости в поиске. –