Что-то, что я видел снова и снова в базе кода, в которой я работаю, - это сценарий, в котором несколько заводов или других решетов объектов принимают один и тот же параметр и принимают решение о реализации на основе этого параметра.Переопределение модуля Guice per request?
interface Foo {
foo();
}
interface Bar {
bar();
}
class FooProvider {
... members constructor etc...
Foo get(BazType bazType) {
switch (bazType) {
case BAZ_A:
return bazA;
case BAZ_B:
return bazB;
....
}
}
}
class BarProvider {
Bar get(BazType bazType) {
...same as fooFactory
}
}
... more interfaces and providers follow
Эти провайдеры (фабрики? Не уверен, что называть их) будет называться один или несколько раз в жизни запроса в возможно различных классов, но BazType будет определяться и окончательным в начале запрос. Я нахожу это излишним и потенциально опасным, что мы должны делать это много раз, когда это нужно делать только один раз.
Возможно ли определить реализации и связать их все в определенном модуле и загрузить необходимый модуль на основе каждого запроса/потока? Я вижу, что есть Modules.override(), но, похоже, это более одно время, чтобы поменять производственный код для кода тестирования или разработки, а не на то, что мне нужно. Очевидно, я не собираюсь создавать инжектор для каждого запроса, который я обслуживаю.
Если я что-то не хватает, что на самом деле не получить меня, что я хочу, хотя. Я бы заменил каждый оператор switch на map.get (BazType). Я согласен с тем, что это будет скорее улучшением по сравнению с тем, что мы сейчас делаем (это обсуждалось здесь), но решение по-прежнему принимается много раз в течение потока запросов, а не один раз. –