2009-10-08 43 views
1

我一直在研究Seam框架很久。尽管我不在工作中使用它,但我喜欢它的方法。这很有趣。但我有些怀疑。在阅读Seam in Action书籍后,我认为你不可能将多于一个参数绑定到商业方法。类似于在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 
    } 

} 
  • 您可以使用Seam上下文

//

@Stateless 
public class BusinessObjectImpl implements BusinessObject { 

    public void doSomething() { 

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

     SomeObject output ...    

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

} 

如果第一种方法在无状态中使用,它有很多方法,所以我认为最好使用Command模式为业务对象建模。我对吗 ?喜欢的东西

public class DoSomething implements Command { 

    @In 
    private SomeObject input01; 

    @In 
    private SomeObject input02; 

    @Out 
    private SomeObject output01; 

    public void execute() { 

    } 

} 

你:什么模式(和良好做法)你使用,以避免在一个无状态的业务对象的许多成员字段?

问候,

回答

2

不,这是完全错误的。当然,你可以在Seam方法中有很多参数。这只是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);  
    } 

} 

EDIT(基于评论):

有从使用JBoss EL(它允许对象作为参数)页面传递多个参数的方法。例如

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

如果您SecondBeanThirdBean已经在你的会话/谈话填充(及其相关的@Name)和你的FirstBean看起来是这样的:

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

但这种方法是不完全因为它依赖SecondBean和ThirdBean在您当前的会话/对话中。你可能会更好地遵循拥有一个页面Controller或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); 
    } 
} 

这开始看起来很像你原来的问题;-)

+0

谢谢你,大摩。我如何将一个以上的参数从JSF页面传递给业务对象?你能告诉我如何...?我是Seam的新手。 – 2009-10-08 17:06:45

+0

谢谢,真的很好,我的下一步就是成为Seam的开发者。 – 2009-10-08 18:55:23