代码之家  ›  专栏  ›  技术社区  ›  Arthur Ronald

在Seam框架中建模业务对象的模式?

  •  1
  • Arthur Ronald  · 技术社区  · 15 年前

    我研究Seam框架已经很长时间了。尽管我在工作中不使用它,但我喜欢它的方法。这很有趣。但我有些怀疑。看完动作书的接缝后,我想你是不可能装订的 多个参数 一种商业方法。类似的东西

    @Stateless
    public class BusinessObjectImpl implements BusinessObject {
    
        public void doSomething(SomeObject i01, SomeObject i02 and so on...) {
    
    
        }
    
    }
    

    我说的对吗?因此,你有两种方法:

    • @进(注射用)和出(注射用)

    / /

     @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);
        }
    
    }
    

    如果第一种方法是在无状态的情况下使用的,其中有许多方法,那么我认为最好使用命令模式来建模业务对象。我说得对吗?有点像

    public class DoSomething implements Command {
    
        @In
        private SomeObject input01;
    
        @In
        private SomeObject input02;
    
        @Out
        private SomeObject output01;
    
        public void execute() {
    
        }
    
    }
    

    您:您使用什么模式(和良好实践)来避免无状态业务对象中的许多成员字段?

    当做,

    1 回复  |  直到 15 年前
        1
  •  2
  •   Damo    15 年前

    不,那完全错了。当然,Seam方法中可以有许多参数。它只是爪哇。这个代码很好:

    @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。您最好遵循使用页面控制器或支持be an的方法。这可以是一个pojo,然后调用您的slsb。例如:

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

    以及支持bean:

    @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);
      }
    }
    

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