Шаблон для моделирования бизнес-объекта в фреймворке Seam? - PullRequest
1 голос
/ 08 октября 2009

Я давно изучаю фреймворк Seam. Хотя я не использую его на работе, мне нравится его подход. Это очень интересно. Но у меня есть некоторые сомнения. После прочтения книги «Шов в действии» я думаю, что невозможно связать более одного параметра с бизнес-методом. Что-то вроде

@Stateless
public class BusinessObjectImpl implements BusinessObject {

    public void doSomething(SomeObject i01, SomeObject i02 and so on...) {


    }

}

Я прав? Из-за этого у вас есть два подхода:

  • @ In (для инъекций) и @Out (для инъекций)

//

 @Stateless
 public class BusinessObjectImpl implements BusinessObject {

    @In
    private SomeObject input01;

    @In
    private SomeObject input02;

    @In
    private SomeObject input03;

    @Out
    private SomeObject output01;

    @Out
    private SomeObject output02;

    @Out
    private SomeObject output03;


    public void doSomething() {
        // some code
    }

}
  • Вы можете использовать контекст шва

//

@Stateless
public class BusinessObjectImpl implements BusinessObject {

    public void doSomething() {

        SomeObject input = Context.get("contextualName");

        SomeObject output  ...            

        Context.set("contextualName", output);
    }

}

Если первый подход используется в Stateless, где у него много методов, то я думаю, что лучше моделировать бизнес-объект с помощью шаблона Command. Я прав ? Что-то вроде

public class DoSomething implements Command {

    @In
    private SomeObject input01;

    @In
    private SomeObject input02;

    @Out
    private SomeObject output01;

    public void execute() {

    }

}

А вы: какой шаблон (и передовой опыт) вы используете, чтобы избежать многих полей-членов в бизнес-объекте без состояния?

С уважением,

1 Ответ

2 голосов
/ 08 октября 2009

Нет. Это совершенно неправильно. Конечно, вы можете иметь много параметров в методах шва. Это просто Java. Этот код в порядке:

@Stateless
public class BusinessObjectImpl implements BusinessObject {

    public void doSomething(SomeObject i01, SomeObject i02) {


    }
}

Конечно, Seam позволяет вам вводить любые другие классы, которые вы можете найти полезными. Может быть так:

@Stateless
public class BusinessObjectImpl implements BusinessObject {

    @In
    private AnotherObject anotherObject;

    public void doSomething(SomeObject i01, SomeObject i02) {
       anotherObject.someMethod(i01, i02);    
    }

}

РЕДАКТИРОВАТЬ (на основе комментария):

Существуют способы передачи нескольких параметров со страницы с использованием JBoss EL (который учитывает объекты в качестве параметров). Например

<h:form>
  <h:commandButton action="#{firstBean.performAction(secondBean, thirdBean)}">Go</h:commandButton>
</h:form>

Где ваши SecondBean и ThirdBean уже заполнены в вашем сеансе / разговоре (с соответствующими @Name), а ваш FirstBean будет выглядеть примерно так:

@Name("firstBean")
@Stateless
public class FirstBean {
  public void performAction(SecondBean secondBean, ThirdBean thirdBean) {
    //stuff
  }
}

Но этот подход не совсем элегантен, так как он основан на SecondBean и ThirdBean, находящихся в вашей текущей сессии / разговоре. Возможно, вам лучше придерживаться подхода, связанного с контроллером страницы или компонентом Backing Bean. Это может быть POJO, который затем вызывает ваш SLSB. Например:

<h:form>
  <h:commandButton action="#{backingBean.performAction}">Go</h:commandButton>
</h:form>

И бэк:

@Name("backingBean")
@Scope(ScopeType.CONVERSATION)
public class BackingBean {
  @In
  private FirstBean firstBean;

  @In
  private SecondBean secondBean;

  @In
  private ThirdBean thirdBean;

  public void performAction() {
    firstBean.performAction(secondBean, thirdBean);
  }
}

Что очень похоже на ваш первоначальный вопрос; -)

...