2010-08-02 22 views
6

Realmente me gustó el marco de aplicación de JBoss Seam. Dado que la noción de inyección/inyección y la estrecha integración entre JSF/EJB/JPA es relativamente escasa entre los frameworks de aplicaciones Java, estaba buscando algunos buenos recursos para los patrones de diseño y las mejores prácticas para usar este framework. He echado sobre los ejemplos y varios libros sobre el tema. Sin embargo, estoy más interesado en los patrones de diseño del mundo real que se comparan con los patrones de diseño J2EE tradicionales. Por ejemplo, DAO tradicionales frente a EntityHome/EntityQuery. ¿Dónde debe realizarse la lógica de negocios? En clases de acción? ¿O en clases de servicio dedicado? Realmente agradecería cualquier idea que los experimentados desarrolladores de Seam puedan dar. ¡Gracias!JBoss Seam Design Patterns?

Respuesta

8

Hay muchos patrones útiles que puede usar.

enfoque tradicional

view >> controller >> service >> domain 

que puede traducirse Para

/** 
    * 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); 
    } 

} 

Si usted tiene algunas acciones , que necesita manipular componentes JSF en el lado del servidor, utilice un controlador como se muestra arriba puede ser una buena idea

También puede usar

view >> service >> domain 

Es básicamente el mismo enfoque se muestra arriba pero sin controlador

o utilizando una función de patrón de mediador mediante el uso de EntityHome/EntityQuery

view >> domain 

Registre su EntityHome de la siguiente manera /WEB -INF/components.xml

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

Ahora usted puede crear un alias mediante el uso de elementos de fábrica

<factory name="account" value="#{accountHome.instance}"/> 

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

Nada más. Tenga en cuenta cuando se utiliza EntityHome (APP) o HibernateEntityHome (Hibernate) que en general tienen que reemplazar algunos métodos para mejorar el rendimiento de la siguiente manera

@Name("accountHome") 
public class AccountHome extends EntityHome<Account> { 

    /** 
     * Override any method you want right here 
     */ 

} 

Sobre la lógica de negocio ??? Puede colocarlo dentro de su capa de servicio o puede usar un enfoque de diseño basado en dominio. Consulte here que se ajuste mejor a lo que desea

Pruebas: utilice Seam bundled Testing components. Eche un vistazo a Seam ejemplos directorios Para obtener una visión general de cómo puede realizar Pruebas sin implementación

Si es posible, use seam-gen Para generar su proyecto. Seam in Action book, capítulo 2, puede da una buena idea de cómo iniciar las capacidades de seam-gen. lea atentamente.Cualquier costura de generación genera proyecto se puede abrir y probado en NetBeans y Eclipse

componentes JSF: Tome un vistazo a here

Hay más: No utilice @ fuera Jection más. Use @Factory en su lugar. @ Out-jection quedará obsoleto a favor del método @Factory.

Creo consultas es mejor guardados dentro de un archivo externo, porque

  • Es legible
  • Es fácil de mantener

En la siguiente manera

<?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> 

uno de los buenos, don' t

Otro recurso va aquí (formato pdf)

JBoss Seam: Agile RIA Development Framework

+0

Wow! Ahora que es una respuesta detallada. ¡Muchas gracias por su visión! – Shadowman

+0

Derecha, Arthur es el tipo Seam aquí :) – BalusC

+0

Buena respuesta. Pero me mantendría alejado de Seam Application Framework. (EntityHome, EntityQuery, etc.) –