Стас, а если попробывать пойти по несколько другому пути. Логика зависит от имени домена. Создаешь интерфейс, который описывает логику. Если есть общая логика, то вдобавок - абстрактный класс, реализующий эту общую логику. Затем создаешь конкретные классы под каждое конкретное поведение и заносишь их в Map: login.put("somedomain", new Logic1()). И далее, в зависимости от домена либо interceptor'ами, либо какими-либо другими механизмами меняешь поведение. Вообще вариантов достаточно много можно придумать. Можно еще попробывать добавить в контроллер класс на подобие: public class Logic implements ....{ public void apply(SomeArg arg1) {} // interface method private logic1() {} private logic2() {} }
И здесь уже все от фантазии зависит. Либо в одном классе реализовывать различную логику, либо разбросать по классам, а методом apply только делегировать в зависимости от определенного условия. В общем, примерно так.
Упрощенно это выглядит так: public class SomeController implements Controller {
private Map logicSet;
public ModelAndView(HttpServlet request, ....) Logic logic = logicSet.get(request.getServerName()); logic.execute(); return new ModelAndView(...); }
public void setLogicSet(Map logicSet) { this.logicSet = logicSet; } }
Инстансы классов с различной логикой создаются при старте приложения, а далее происходит только выбор необходимой. Можно еще сильнее ослабить зависимости, но это уже дело вкуса.
вам надо войти в команду разработчика Semagic'а - полезная прога, но к сожалению не всемогущая(думаю иногда, ее спецом не развивают, чтоб рекламный трафик жж не сокращать...)
Comments 4
Логика зависит от имени домена. Создаешь интерфейс, который описывает логику.
Если есть общая логика, то вдобавок - абстрактный класс, реализующий эту общую логику. Затем создаешь конкретные классы под каждое конкретное поведение и заносишь их в Map: login.put("somedomain", new Logic1()). И далее, в зависимости от домена либо interceptor'ами, либо какими-либо другими механизмами меняешь поведение.
Вообще вариантов достаточно много можно придумать. Можно еще попробывать добавить в контроллер класс на подобие:
public class Logic implements ....{
public void apply(SomeArg arg1) {} // interface method
private logic1() {}
private logic2() {}
}
И здесь уже все от фантазии зависит. Либо в одном классе реализовывать различную логику, либо разбросать по классам, а методом apply только делегировать в зависимости от определенного условия.
В общем, примерно так.
Reply
login.put("somedomain", new Logic1());
(смысл этой строчки от меня ускользает, но в любом случае межтредовые конфликты здесь будут).
В результате надо этот Map хранить в ThreadLocal, чтобы разруливать конфликты. В результате получаем несколько навороченный способ номер 2.
Reply
public class SomeController implements Controller {
private Map logicSet;
public ModelAndView(HttpServlet request, ....)
Logic logic = logicSet.get(request.getServerName());
logic.execute();
return new ModelAndView(...);
}
public void setLogicSet(Map logicSet) { this.logicSet = logicSet; }
}
Инстансы классов с различной логикой создаются при старте приложения, а далее происходит только выбор необходимой. Можно еще сильнее ослабить зависимости, но это уже дело вкуса.
Reply
Reply
Leave a comment