Diseño de la Capa de Negocio Aplicaciones Distribuidas Motivación • Motivación: • Implantar un modelo UML (diagramas de clases y colaboraciones) de una aplicación empresarial. • Solución:è Enterprise JavaBeans • Implantar los objetos de negocio con distintas posibilidades de persistencia. • Implantar la lógica de negocio (controladores cdu) como objetos distribuidos y transaccionales. • Eficiencia en la gestión de recursos. • Seguridad. • ... • è Modelo de programación complejo 2 Guías básicas de diseño • Implantar los objetos de negocio y sus relaciones como componentes Entidad: • Persistencia: • BMP: manejar almacenamiento XML, LDAP, ... • CMP 1.x: integración con otro sistema de información. • CMP 2.x: propósito general. • En general, definir interfaces locales. • Sólo accesibles para los controladores de cdu. • Utilizar un modelo transaccional “required”: • Integración con la operación transaccional del cdu. • Implantar los controladores de cdu como componentes Sesión: • Decidir entre un controlador con estado (stateful) o sin estado (stateless). • Modelo transaccional “required”. 3 Ejemplo de Colaboración Capa Presentación Cliente Sesión Stateful Entidades pedidos : ControladorPedidos pedidoActual : Pedido l1 : LineaPedido p1 : Producto totalAPagar( ) getTotal( ) getSubt otal( ) precio( ) getSubt otal( ) 4 l2 : LineaPedido Patrones – Factoría de Homes • Problema: • Necesidad de uso objetos Home: crear una Pedido, conectar una Línea de Pedido con un Producto, ... • Acceso local o remoto al objeto Home a través de JNDI: !Context ctxInicio = new InitialContext();! ! !// Obtiene una referencia local al Home! !Object obj = entorno.resolve(“Producto");! !ProductoLocalHome productoHome = (ProductoLocalHome) obj;! • Solución: • Utilizar una factoría (singleton) de objetos Home que mantenga una caché de referencias: EJBHomeFactory ProductoLocalHome productoHome = !! !(ProductoLocalHome) EJBHomeFactory.getInstance().getHome(“Producto”)! ! 5 Patrones – Value Object • Motivación: • Necesitamos la información de un objeto de negocio. • Alternativa 1: • Devolver una referencia remota al objeto Cliente pedidos : GestorPedidos getInfoProducto( ) • Inconvenientes: • Múltiples invocaciones remotas. getNombre( ) getPrecio( ) ... 6 Acceso remoto RMI/IIOP : Producto Patrones – Value Object • Alternativa 2: • Construir un objeto de datos (Value Object) que sea devuelto por valor (serializable). • Ventajas: • Una sola invocación remota para obtener los datos. Cliente producto: ProductoVO pedidos : GestorPedidos : Producto producto : Product oVO getInfoProducto(id) getVO( ) return producto getNombre( ) getPrecio( ) ... Capa de Presentación Servidor EJB 7 new( ) Patrones – Value Object • Consecuencias: • Introducir los métodos getVO y setVO (actualizaciones) en todos los objetos de negocio. • Problemas: • Distintos cdu pueden necesitar una pequeña parte de la información de un objeto de negocio. • Necesitamos información de varios objetos de negocio (submodelo): • Ejemplo: información de un pedido • Objeto pedido, sus líneas de pedido y de los productos. • à Custom Value Object • è El controlador se encarga de componer el objeto: • Un VO puede estar compuesto de otros VOs. • Ejemplo: PedidoVO contiene una colección de LineaPedidoVO 8 Patrones – Custom Value Object Cliente pedidos : GestorPedidos infoPedido( ) pedidoVO : PedidoVO miPedido : Pedido new( ) getTotal( ) setTotal( ) getLineasVenta( ) getProducto( ) new( ) getNombre( ) precio( ) setNombreProducto( ) setPrecioProducto( ) getSubTotal( ) setSubTotal( ) Compone la colección de Líneas de Pedido VO setLineasPedidoVO( ) return pedidoVO 9 lp1 : LineaPedido lp1VO : p1 : Producto LineaPedidoVO Patrones – Iterador • Motivación: • Devolver una colección de objetos de negocio de un modo eficiente. • Solución: • Implementar un iterador distribuido. • Obtendrá una colección de objetos de negocio sobre los que iterar. • Irá devolviendo sus VO asociados según vayan siendo necesarios. • Implementado como un objeto de tipo sesión. 10 Patrones – Iterador Session Stateful Cliente pedidos : GestorPedidos it : IteradorR em oto : ProductoHome p1 : Producto getProductos( ) col = findAll( ) new(col) ret urn it "create" del Home next(n) getVO( ) getVO( ) return colVO Compone la colección de los siguientes "n" VO previous(n) 11 p2 : Producto Patrones – Business Delegate • Motivación: • El modelo puede estar implementado con diferentes tecnologías: DAO, RMI, CORBA, EJB • Independizar Presentación del Modelo. • Solución: è Patrón Bussiness Delegate • Interface Java con las operaciones cdu • GestorPedidosDelegate • Implementado por una clase que hace de proxy (delegate) • Obtiene el controlador del modelo. • Delega todas sus operaciones en él. • Factoría de Delegates. 12 Patrones – Service Locator • Problema: • Los delegados se crean continuamente: por sesión y cdu. • Un delegado obtiene el controlador EJB a través de JNDI y de su interface home • El acceso JNDI es costoso. • Solución: è Patrón Service Locator • Proporciona referencias a los objetos Home de los controladores. • Se encarga de los detalles de acceso (propiedades JNDI) • Mantiene una caché de referencias. • è Similar a la factoría de homes, pero en la capa de presentación. • Propósito general: objetos distribuidos, EJB, colas JMS, ... 13