2015-01-23 2 views
1

Что-то, что я видел снова и снова в базе кода, в которой я работаю, - это сценарий, в котором несколько заводов или других решетов объектов принимают один и тот же параметр и принимают решение о реализации на основе этого параметра.Переопределение модуля 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(), но, похоже, это более одно время, чтобы поменять производственный код для кода тестирования или разработки, а не на то, что мне нужно. Очевидно, я не собираюсь создавать инжектор для каждого запроса, который я обслуживаю.

ответ

1

Вы должны проверить удлинитель переплетения гуса. Он позволяет предопределять карты, содержащие ваши провайдеры, а затем вводить эту карту и выбирать из нее.

+0

Если я что-то не хватает, что на самом деле не получить меня, что я хочу, хотя. Я бы заменил каждый оператор switch на map.get (BazType). Я согласен с тем, что это будет скорее улучшением по сравнению с тем, что мы сейчас делаем (это обсуждалось здесь), но решение по-прежнему принимается много раз в течение потока запросов, а не один раз. –

Смежные вопросы