5.6.3 Session Facade Session Facade (1) Intención Proporcionar una interfaz sencilla que soporta un conjunto de casos de uso relacionados Motivación La explicada en el tema 2: proporcionar una interfaz sencilla que soporta un conjunto de casos de uso relacionados (en general, una operación por cada caso de uso), ocultando las relaciones existentes en la implementación de cada caso de uso Adicionalmente, cuando se usa EJB, se pretende reducir el número de invocaciones remotas y evitar que el cliente tenga que usar el API de transacciones Ej.: MiniBank Session Facade (2) Motivación (cont) Opción 1 Definir los interfaces de los Entity Beans como remotos, prescindir del Session Bean e implementar la fachada en el Business Delegate :EJBAccountFacadeDelegate :AccountHome src:Account findByPrimaryKey(srcId) transfer(srcId, destId, amount) findByPrimaryKey(destId) getBalance() withdraw(amount) add(amount) MVJ-1 Red MVJ-2 NOTA: Por cuestiones de espacio, el diagrama no ilustra la creación de las dos operaciones bancarias dest:Account Session Facade (3) Motivación (cont) Opción 1 (cont) La operación transfer involucra 7 operaciones remotas (las 5 mostradas más las dos correspondientes a AccountOperationHome.create) La implementación de transfer necesita usar el API de transacciones (javax.transaction) Lógica de negocio en el cliente => no se beneficia de las ventajas de una arquitectura en 3 capas Opción 2 Definir los interfaces de los Entity Beans como locales e implementar la fachada como un Session Bean remoto El Business Delegate es un Proxy de la fachada Session Facade (4) Motivación (cont) Opción 2 (cont) :EJBAccountFacadeDelegate transfer(srcId, destId, amount) :AccountLocalHome src:AccountLocal :AccountFacadeEJB findByPrimaryKey(srcId) transfer(srcId, destId, amount) findByPrimaryKey(destId) getBalance() withdraw(amount) add(amount) MVJ-1 dest:AccountLocal Red MVJ-2 NOTA: Por cuestiones de espacio, el diagrama no ilustra la creación de las dos operaciones bancarias Session Facade (5) Motivación (cont) Opción 2 (cont) La operación transfer involucra 1 operación remota El contenedor de EJBs gestiona la transacción automáticamente Lógica de negocio en contenedor de EJBs Las anteriores desventajas (opción 1) y ventajas (opción 2) no son sólo para transfer, sino para todas las operaciones Aplicabilidad Cuando se quiere ofrecer una versión simplificada de un conjunto de EJBs Cuando se quiere reducir el número de invocaciones remotas desde la capa cliente Session Facade (6) Estructura <<SessionBean>> <<use>> BusinessObject SessionFacade Client <<EntityBean>> BusinessEntity <<use>> <<SessionBean>> BusinessSession <<use>> DataAccessObject Participantes Client (EJBAccountFacadeDelegate) Puede ser un Business Delegate u otro Session Facade SessionFacade (AccountFacadeEJB) Normalmente, un Session Bean Proporciona un interfaz sencillo al cliente, ocultando las relaciones entre numerosos objetos de negocio Session Facade (7) Participantes (cont) Business Object (Account y AccountOperation) Colaboraciones Proporciona datos (Entity Bean o DAO) o un servicio (Session Bean) Un SessionFacade coordina a un conjunto de objetos de negocio para implementar un conjunto de casos de uso relacionados Consecuencias Beneficios Simplifica el mantenimiento Reduce el número de invocaciones remotas Simplifica la gestión de transacciones Session Facade (8) Implementación Un Session Facade se implementa como un SLSB o SFSB en función de si necesita guardar estado o no Ej.: AccountFacade (SLSB) en MiniBank Ej.: UserFacade (SFSB) en MiniPortal En el caso de una aplicación web y disponer de un contenedor completo de J2EE => Session Facades (Session Beans) con interfaces locales Evitar que el Session Facade termine siendo una clase grande La descripción de este patrón en el sitio web de IBM, recomienda implementar las operaciones que requieren más de 4 ó 5 líneas de código (sin contar la gestión de excepciones), en clases acción Designing Enterprise Applications with the J2EE ilustra una versión potente (quizás demasiado compleja) de la aplicación del patrón Command, que minimiza el número de operaciones del Session Facade EJB Design Patterns ilustra una versión muy simplificada (quizás no útil) de la aplicación del patrón Command (patrón EJB Command) Session Facade (y 9) Implementación (cont) para referirse a un Session Facade con operaciones que devuelven Custom Value Objects EJB Design Patterns llama Data Transfer Object Factory a una variante del patrón Value Object Assembler que además incluye operaciones de actualización Código de ejemplo Core J2EE Patterns habla del patrón Value Object Assembler AccountFacade (SLSB) en MiniBank UserFacade (SFSB) en MiniPortal Patrones relacionados Facade Data Access Object Service Locator Business Delegate