Design Patterns for Java

Jun 24, 2007 11:32

Предположим, был у меня простой сайт с набором бинов, которые делают что-то полезное.



interface JobMaker {
public String doSomethingCool();
}

class JobMakerImpl implements JobMaker {
public String doSomethingCool() {
return "This is my cool localhost website!";
}
}

Теперь усложняем задачу. Наше веб-приложение теперь будет отдаваться не по одному, а по нескольким разным доменам. Причем логика работы веб-приложения должна несколько меняться в зависимости от того, по какому домену зашли.
Например, если зашли через localhost1, то JobMakerImpl должен сказать "This is my cool localhost1 website!". Напоминаю, это всего лишь упрощенный пример логики, на практике логика куда как посложнее, поэтому вопрос в том, по какому паттерну решать такие задачи.

Теперь я вижу два способа поменять наши бины, чтобы они работали в зависимости от домена. Способ 1: передавать HttpServletRequest через аргументы методов, всегда и везде где это нужно. Соответственно для этого придется переделывать интерфейсы и имплементации. И вообще очень много методов получат новый аргумент.

Способ 2: сделать специальный бин на основе ThreadLocal, который будет хранить данные о request'е, домене и т.п., и к нему можно будет обращаться из любого другого бина, без необходимости передавать данные о request'е через аргументы. Это избавляет от необходимости менять интерфейсы, но возможны неприятные межтредовые конфликты.

Сталкивался кто-нибудь с подобной задачей? Как посоветуете поступить? Я изначально пошел по второму способу, но наткнулся на трудноуловимые межтредовые конфликты, в результате чего вылезают баги (заходим на localhost2, а показывается localhost1 из-за того, что какой-то другой посетитель зашел на localhost1). Решил пойти по первому способу, но слишком много интерфейсов приходится переколбашивать и везде приходится добавлять паразитные аргументы...

tech, question

Previous post Next post
Up