代码之家  ›  专栏  ›  技术社区  ›  Shadowman

JBossSeam设计模式[[关闭]

  •  6
  • Shadowman  · 技术社区  · 15 年前

    我非常喜欢JBossSeam应用程序框架。由于JSF/EJBs/JPA之间的注入/出射和紧密集成的概念在Java应用程序框架中相对较少,因此我正在寻找一些关于设计模式和使用该框架的最佳实践的好资源。关于这个问题,我已经列举了许多例子和几本书。然而,与传统的J2EE设计模式相比,我对真实世界的设计模式更感兴趣。例如,传统的DAOs与EntityHome/EntityQuery。业务逻辑应该在哪里执行?行动班?还是在专门的服务班?我非常感谢有经验的Seam开发人员能够提供的任何见解。谢谢!

    1 回复  |  直到 15 年前
        1
  •  8
  •   Community Mohan Dere    9 年前

    传统方法

    view >> controller >> service >> domain
    

    可以翻译成

    /**
      * view
      */
    <h:commandButton value="Deposit" action="#{accountController.removeAccount(account)}"/>
    
    /**
      * controller
      */
    @Name("accountController")
    public class AccountController implements Serializable {
    
        /**
          * Usually a plain POJO or EJB
          */
        private @In AccountService accountService;
    
        public void removeAccount(Account account) {
            accountService.removeAccount(account);
        }
    
    }
    
    /**
      * service
      */
    @Name("accountService")
    public class AccountServiceImpl implements AccountService {
    
        private @In EntityManager entityManager;
    
        public void removeAccount(Account account) {
            entityManager.remove(account);
        }
    
    }
    

    它需要操作JSF组件

    你也可以使用

    view >> service >> domain
    

    基本上与上面所示的方法相同 但没有控制器

    view >> domain
    

    按以下方式注册您的EntityHome

    <framework:entity-home name="accountHome" entity-class="br.com.ar.seam.Account"/>
    

    现在您可以创建 化名 使用工厂元素

    <factory name="account" value="#{accountHome.instance}"/>
    
    /**
      * view 
      *
      * Notice account will be evaluated as accountHome.instance
      */
    <h:commandButton value="Deposit" action="#{account.remove}"/>
    

    没别的了。请记住,在使用EntityHome(JPA)或HibernateEntityHome(Hibernate)时,通常需要重写一些方法来提高性能,如下所示

    @Name("accountHome")
    public class AccountHome extends EntityHome<Account> {
    
        /**
          * Override any method you want right here
          */
    
    }
    

    关于业务逻辑???您可以将其放在服务层中,也可以使用域驱动的设计方法。看到了吗 here

    测试:使用接缝捆绑测试组件。看看接缝 示例 目录以获得如何在不部署的情况下执行测试的概述

    如果可能,使用seam gen生成项目。Seam in Action手册第2章可以很好地说明如何启动Seam gen功能。 仔细阅读 . 任何seam gen生成的项目

    JSF组件:看一下 here

    我认为查询最好存储在外部文件中,因为

    • 它是可读的
    • 它是可维护的

    如下

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <query name="GIFT_CARDS_WITH_BUYER">
            <![CDATA[
                from 
                    GiftCard c
                left join fetch 
                    c.buyer
                where
                    c.recipientNotificationRequested = 1
            ]]>
        </query>
        <query name="GIFT_CARDS_WITHOUT_NO_RELATIONSHIP">
            <![CDATA[
                from 
                    GiftCard
            ]]>
        </query>
    </hibernate-mapping>
    

    不错,别这样

    JBoss Seam: Agile RIA Development Framework

    推荐文章