• Save
Desarrollo en Capas con .Net
Upcoming SlideShare
Loading in...5
×
 

Desarrollo en Capas con .Net

on

  • 21,051 views

Que implica desarrollar software con un Modelo de Negocio OO? - Capas con .NET+NHibernate - Desarrollo de componentes

Que implica desarrollar software con un Modelo de Negocio OO? - Capas con .NET+NHibernate - Desarrollo de componentes

Statistics

Views

Total Views
21,051
Views on SlideShare
11,246
Embed Views
9,805

Actions

Likes
11
Downloads
0
Comments
1

44 Embeds 9,805

http://metodologiasdesistemas.blogspot.com 6867
http://metodologiasdesistemas.blogspot.com.ar 861
http://metodologiasdesistemas.blogspot.mx 810
http://metodologiasdesistemas.blogspot.com.es 654
http://edwincamino.blogspot.com 165
http://www.ironicnet.com 131
http://www.slideshare.net 48
http://estudionhibernate.wikispaces.com 42
http://metodologiasdesistemas.blogspot.pt 27
http://metodologiasdesistemas.blogspot.com.br 27
http://hpfloresj.blogspot.com 20
http://metodologiasdesistemas.blogspot.de 18
http://www.metodologiasdesistemas.blogspot.com 16
http://metodologiasdesistemas.blogspot.in 12
http://metodologiasdesistemas.blogspot.fr 11
http://www.edwincamino.blogspot.com 10
http://hppersonal.blogspot.com 9
http://translate.googleusercontent.com 8
http://metodologiasdesistemas.blogspot.it 8
http://hpfloresj.blogspot.mx 7
http://www.metodologiasdesistemas.blogspot.com.ar 7
http://metodologiasdesistemas.blogspot.nl 5
http://tallerdedesarrollodelinfante.blogspot.com 5
http://metodologiasdesistemas.blogspot.co.uk 3
http://www.directrss.co.il 3
http://static.slideshare.net 3
http://metodologiasdesistemas.blogspot.be 3
http://metodologiasdesistemas.blogspot.se 3
http://metodologiasdesistemas.blogspot.ro 2
http://webcache.googleusercontent.com 2
http://metodologiasdesistemas.blogspot.tw 2
http://hpfloresj.blogspot.com.es 2
http://stuard540.blogspot.com 2
http://metodologiasdesistemas.blogspot.kr 2
http://metodologiasdesistemas.blogspot.ca 1
http://metodologiasdesistemas.blogspot.jp 1
http://hppersonal.blogspot.mx 1
http://209.85.195.132 1
http://edwincamino.blogspot.com.es 1
http://metodologiasdesistemas.blogspot.ch 1
http://metodologiasdesistemas.blogspot.hu 1
http://static.slidesharecdn.com 1
http://www.google.com 1
http://98.139.236.92 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Desarrollo en Capas con .Net Desarrollo en Capas con .Net Presentation Transcript

  • Desarrollo en Capas con “mejorando la productividad y reutilizaciòn” Disertante: Jorge Ercoli (Analista de Sistemas) Jornadas sobre Desarrollo de Software UTN Centro de Estudios Mar del Plata - Argentina
  • Temario
    • Componentes de software
    • La Lògica del Negocio
    • Arquitectura sin capa de negocio
    • Arquitectura de 3 Capas lògicas. Responsabilidad de los componentes de cada capa.
    • Capa de Negocio. Ventajas. Patrones: Transaction Script y Domain Model
    • Capa de Acceso a Datos. Persistencia de objetos de negocio. ORMs, ventajas, patrones: ActiveRecord y DataMapper
    • NHibernate: arquitectura, proceso de desarrollo, uso.
    • BREAK (30 minutos)
    • Desarrollo de software aplicando 3 capas, “ConferenciaWeb” sitio de ejemplo usando AspNet 2, C# y Nhibernate
    • Comprendiendo el còdigo de cada componente:
      • Presentaciòn (Asp Net pages)
      • Procesos de Negocio (Clases controladoras de CU)
      • Objetos de Negocio (Clases que representan las Entidades)
      • Acceso a Datos (DAOs de los objetos de Negocio)
    • “ Toda la arquitectura es diseño, pero no todo el diseño es arquitectura.
    • La arquitectura representa las decisiones de diseño significativas que le dan forma a un sistema, donde lo significativo puede ser medido por el costo del cambio .”
    • Grady Booch
  • Componentes de Software
    • Componentes ??
    • “ E s una pieza de software que realiza una función bien definida, y posee una interfaz bien definida”
    • “ Bloques de construcciòn fìsicos del sistema”
    * En .NET son los “assemblies” (ensamblados), los cuales pueden ser exe ò dll.
  • Beneficios de trabajar con componentes
    • La división en componentes reduce la complejidad , permite la reutilización y acelera el proceso de ensamblaje de software. (plug-in)
    • Los creadores de componentes pueden especializarse creando objetos cada vez mas complejos y de mayor calidad .
    • La interoperabilidad entre componentes de distintos fabricantes aumenta la competencia , reduce los costos y facilita la construcción de estandares
    • Los costos de mantenimiento del software se reducen.
  • Lògica de Negocio
    • “ Procesos y reglas del dominio del negocio, obtenidos en la fase de Análisis del Sistema”
    • Ejemplo para sistema de Gestión de Conferencias
    • “ Inscripciòn de un Oyente a una Conferencia”
    • “ No inscribir nuevos oyentes si se excediò la capacidad del Salon”
    • “ Consultar las Conferencias que poseen vacantes”
    • “ Registrar altas de nuevos Oyentes”
    • “ Permitir el cambio de Salòn de una Conferencia sòlo cuando la cantidad de inscriptos no supere su capacidad”
  • Arquitectura sin Capa de Negocio Presentaciòn Acceso a Datos InscribirClick( ) { conf_Id=ComboConferencia.SelectedValue; oye_Id=LabelOyenteId; dtOyeInsc= sqlExec(“sele * from conf_oye where…”); if (dtOyeInsc.Count()=0) // Oyente inscripto?? Inscriptos=sqlExec(“sele count(*) from conf_oye…”); dtSalon= sqlExec(“sele * from Salon where Id=…”); if (dtSalon(0).Capacidad – Inscriptos > 0) sqlExec(“Insert into conf_oye … values …”); else Mostrar(“No Hay Vacantes !!”); else Mostrar(“Oyente ya inscripto !!”); }
  • Arquitectura con Capa de Negocio InscribirClick( ) { conf_Id=ComboConferencia.SelectedValue; oye_Id=LabelOyenteId; ProcesoInscrip i=new ProcesoInscrip(); try { i.Inscribir (conf_Id, oye_Id); } catch (Excepcion ex) } Negocio Presentaciòn Acceso a Datos
    • Veamos la aplicación sin capa de negocio:
    ConferenciaWeb 2 capas ( DataSets Tipados ) Jorge Ercoli (http://metodologiasdesistemas.blogspot.com)
  • 3 Capas Lògicas Presentaciòn Negocio Acceso a Datos BD
    • Permitir el ingreso de datos del Usuario
    • Mostrar informaciòn en la IU
    • Capturar eventos de la IU
    • Validar el ingreso de datos
    • Llama mètodos de objs. de “Negocio”
    • Da forma al modelo de negocio
      • Servicios basados en CU
      • Objetos de Negocio
    • Posee las reglas de Negocio
    • Procesa los datos de “Presentaciòn”
    • Llama mètodos de objs. de “Acc. a Datos”
    • Acceder a alguna fuente de datos almacenados
    • Permitir realizar operaciones CRUD s/datos
    • Mapear datos a objetos de negocio
  • Capa de Negocio
    • Ventajas:
    • Simplicidad
    • Claridad
    • Reusabilidad
    • Independencia de la infraestructura tecnològica
  • Arquitectura “No Intrusiva” (agnóstica) para la Capa de Negocio
    • Mantener separada la lògica de negocio de las capas màs dependientes de las tecnologìas informàticas ( Presentaciòn : WindowsForms, Consolas, Mobile, WebPages – Acceso a datos : Bases de datos relacionales, BDOO, LINQ, Nhibernate, ActiveRecord, etc)
    Jorge Ercoli (http://metodologiasdesistemas.blogspot.com)
  • Patrones para la Capa de Negocio
    • Transaction Script
      • Basado en Procesos de Negocio (CU)
      • Implementan la lógica de una determinada acción solicitada por la IU
      • ( VerificarDisponibilidad, CalcularInterés, ProcesarOrden, BuscarArtsEnPromoción,...)
      • Orientado a aplicaciones simples con Lógica de Negocio de baja complejidad
      • No existen los Objetos de Negocio, se interactúa con las Tablas de la BDR
      • No se oculta el hecho de que existe una BDR que persiste la aplicaciòn
      • Gran cantidad de la lògica de negocio se traslada al motor de BDR (store procedures)
      • Propenso a mezclar lògica de negocio con persistencia (rompe encapsulamiento)
  • Patrones para la Capa de Negocio (II)
    • Domain Model
      • Basado en una red interconectada de los Objetos de Negocio ( Conferencia, Oyente, Salon, Disertante,...)
      • Asociaciones entre objetos, manejo de colecciones
      • Comportamiento encapsulado en el objeto, de acuerdo a sus Responsabilidades
        • Int cant_Inscriptos=conferencia.CuantosInscriptos();
        • List<Oyente> OyentesInsc=conferencia.DameInscriptos();
        • If (Conferencia.HayVacantes());
      • Permite el aislamiento de sus Capas superiores e inferiores, buen encapsulamiento que permite la creaciòn de Componentes.
      • Se debe solucionar el salto (gap) entre el modelo de objetos y la BDR subyacente (“impedance mismatch”)
  • Patrones para la Capa de Negocio (III)
    • RESUMIENDO:
    • En TS no hacemos un diseño OO, simplemente escribimos métodos por c/solicitud de la IU y los encapsulamos en 1 ó + clases.
    • En DM diseñamos una aplicación OO donde podemos aplicar todo tipo de asociaciones entre objetos.
  • Acceso a datos - Persistencia
    • Como solucionamos el “gap objeto-relacional”?
    • FrameWork ORM (object-relational mapping)
    • Para .NET:
    • NHibernate
    • ActiveRecord (Castle)
    • Linq (sòlo .NET 3)
    • Cooperator (Arg.)
  • Ventajas de usar un ORM
    • Trabajar con las clases diseñadas en el modelo del dominio
    • No trabajar con filas de tablas (nada de DataRows ó RecordSets ó ResultSets)
    • Código OO limpio, que permite el uso de herencia, polimorfismo, composiciòn en nuestras clases de negocio
    • Permite crear, modificar, recuperar y borrar objetos persistentes. Al recuperarlos nos permite navegar por las asociaciones entre objs. y luego actualizarlos al finalizar una transacción.
    • Permite elegir la BD relacional subyacente con la que querramos interactuar (SqlServer-PostGre-MySql-DB2, Oracle,...)
    • Genera automáticamente el cód. SQL usando una definiciòn del mapeo objeto-relacional (XML mapping); ò el còd. de las clases a partir del ddl de la BDR.
  • Patrones para persistir objetos
    • Active Record:
    • Propone tener los métodos que me brindan la persistencia en el mismo objeto de negocio, heredando de una clase Base que posee las operaciones CRUD.
    • Normalmente las instrucciones del mapeo atributo del objeto-campo de la tabla en la definición del objeto de negocio.
    • Data Mapper:
    • Propone que nuestros objetos de negocio sean POCO (ó POJO en Java), o sea que no tengan nada de código que los acople a una tecnología dada de persistencia, ya que no es su función manejarla.
    • Normalmente se maneja la persistencia a través de una clase administradora de la misma (Session ò DataContext). Esta clase es la que se encarga de hacer las operaciones CRUD a la BDR.
  • Active Record
  • Data Mapper
  • Data Mapper (II)
    • Como logramos aislar en su propia capa a las funciones del DataMapper, y asi lograr mayor independencia tecnològica?
    Martin Fowler Patròn DAO (Data Access Object)
  • DAO - Ejemplo
  • Ejemplo de ORM: NHibernate Arquitectura
  • NHibernate (II) – Proceso de desarrollo
    • 1. Crear la clase que necesita ser persistida
    • 2. Crear la tabla para persistir la clase
    • 3. Crear un archivo de mapeo para que NHibernate sepa como persistir las propiedades de la clase
    • 4. Crear un archivo de configuración para que NHibernate sepa como conectarse a su BD.
    • 5. Usar la API del NHibernate
  • NH - Pasos 1 y 2 Clases del Dominio (objs. de negocio) Tablas para persistir objetos
  • NH – Paso 3 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.0&quot; default-access=&quot;property&quot;> <class name=&quot;TPVBO.Venta, TPVBO&quot; table=&quot;Venta&quot; > <id name=&quot;VentaID&quot; column=&quot;idVenta&quot; unsaved-value=&quot;0&quot;> <generator class=&quot;identity&quot; /> </id> <property name=&quot;Fecha&quot; type = &quot;DateTime&quot; /> <property name=&quot;Numero&quot; type = &quot;Int32&quot; /> <bag name=&quot;LineaVenta&quot; cascade=&quot;all&quot;> <key column=&quot;venta&quot;/> <one-to-many class=&quot;TPVBO.LineaVenta, TPVBO&quot;/> </bag> </class> </hibernate-mapping> ............... <class name=&quot;TPVBO.LineaVenta, TPVBO&quot; table=&quot;lineaventa&quot; > <id name=&quot;LineaVentaID&quot; column=“idLineaVta&quot; unsaved-value=&quot;0&quot;> <generator class=&quot;identity&quot; /> </id> <property name=&quot;Cantidad&quot; type = &quot;Int32&quot; /> <many-to-one name=“Producto&quot; class=&quot;TPVBO.Producto, TPVBO&quot; column=&quot;producto&quot; /> </class> </hibernate-mapping>
  • NH – Paso 4 <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot; /> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot; /> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MySQLDialect&quot; /> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.MySqlDataDriver&quot; /> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Server=localhost;Database=TpvHibernate;User ID=jorge;Password=jorge&quot; /> </nhibernate> </configuration> Generalmente en el app.config de la aplicación
  • NH - Paso 5, usemos el ORM!! 1.      Agregamos una referencia a NHibernate.dll (para usarlo en nuestra aplicación) 2.       Creamos un objeto de Configuración Configuration cfg = new Configuration(); 3.       Le decimos al Configuration sobre los tipos de objetos que vamos a persistir cfg.AddAssembly(“TPVBO&quot;); // En TPVBO.dll están mis class con mis class.hbm.xml .... 4.       Creamos una Fabrica de sesiones (1 X BD) y luego le pedimos una Session y comenzamos una transacción. ISessionFactory factory = cfg.BuildSessionFactory(); ISession session = factory.OpenSession(); ITransaction transaction = session.BeginTransaction(); 5.       Trabajamos con nuestros objetos Producto p=new Producto(); p.Codigo=“CA123”; p.Descripcion=“Camisa CA”; p.Precio=59.90; session.Save(p); 6.       Grabamos la transacción en la BD y cerramos la sesión. transaction.Commit(); session.Close();
  • NH – El objeto Session
    • La Session en NHibernate:
    • Es el punto de contacto principal para trabajar con Nhibernate
    • Nuestros objetos se asocian a ella para poder realizar operaciones de persistencia (Save, Update, Delete, Load ó Get)
  • NH – Session (II) Con una session abierta  ISession session = factory.OpenSession();
    • Grabar ó actualizar
      • p.precio = 62.45;
      • session.SaveOrUpdate(p); // hará un Insert si el ID=0, sino un Update con el ID corresp. al obj.
      • session.Flush(); // permite bajar todos los cambios a la BD (sin nec. de tener una transacción)
    • Leer uno o mas objetos
      • Producto p = session.Load( typeof(Producto),m_ID); // Busca el objeto Producto con ese m_ID
      • // Usamos el HQL, similar a SQL pero nombrando los atributos de la clase, NO campos de Tabla !
      • ArrayList misProd = session.Find( “from Producto p where p.Precio > 50”);
    • Borrar
      • session.Delete(p); // borramos nuestro objeto p de tipo Producto
      • session.Flush();
  • NH – Manejo de colecciones // Creo una Venta Venta v=new Venta(); v.Fecha=hoy; v.Numero=22; // Creo 2 lineas de venta LineaVenta l1=new LineaVenta(); l1.Cantidad=10; l1.Producto=session.Load(typeof(Producto),155); LineaVenta l2=new LineaVenta(); l2.Cantidad=5; l2.Producto=session.Load(typeof(Producto),189); // agrego a la colección de lineas de venta de v, las 2 lineas creadas v.lineas.Add(l1); v.lineas.Add(l2); // grabo la venta a la session con sus 2 lineas (por tener el cascade=all ): En la BD se inserta una fila en // Venta y 2 en LineaVenta session.Save(v); session.Flush();
  • NH – manejo de transacciones try { session = factory.OpenSession(); transaction = session.BeginTransaction(); session.SaveOrUpdate(miObjetoNegocio); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); } finally { session.Close(); }
  • BREAK 30 minutos
  • Desarrollemos software en capas ConferenciaWeb Requisitos funcionales:
    • Crear nuevas conferencias
    • Seleccionar el Salón para la Conferencia de una lista.
    • Seleccionar el Disertante que dictará la Conf. de una lista
    • Inscribir Oyentes a las Conferencias disponibles, controlando si
    • existen vacantes
    • Permitir buscar un Oyente por orden alfabético para inscribirlo
    • Permitir el alta de nuevos Oyentes
    • Mostrar las conferencias que se dictarán próximamente, en el Home
    • del sitio
  • ConferenciaWeb – Casos de Uso
  • ConferenciaWeb – Objetos de Negocio
  • ConferenciaWeb – Componentes
  • ConferenciaWeb – Componentes II
  • ConferenciaWeb Presentación llama Negocio
  • Negocio llama Acceso a Datos
    • Veamos la aplicación ejecutarse:
    ConferenciaWeb Jorge Ercoli (http://metodologiasdesistemas.blogspot.com)
  • Nuevo requerimiento
    • Un mismo oyente no puede inscribirse en más de 2 conferencias
    • Donde lo implemento? :
    • En los Objs. de negocio (Conferencia y Oyente)
  • Que más deberíamos ver ?
    • Implementación de “Servicios” en la capa de negocio, que permitan interactuar desde otros subsistemas (SOA, “web services”)
    • FrameWorks que me brinden posibilidad de AOP (facilita el desarrollo de servicios horizontales: logging, autorizaciones, transacciones, error check,..), SPRING.NET
    • Patrones de diseño : fábricas de objs., decoradores, estrategias, fachadas, proxys,...
  • Recursos
    • Libros
      • UML y PATRONES (Prentice Hall - Larman)
      • Programming dot NET components 2nd. Ed. (O´Reilly – Juval Lowy)
      • Head First Design Patterns (O´Reilly – Freeman & Freeman)
      • Applying Domain Driven Design and Patterns, con ejs. en C# y .NET (Jimmy Nilson)
      • Nhibernate in action (Manning – Kuate)
  • Recursos II (sites)
    • Nhibernate best practices with AspNet ( www.codeproject.com/KB/architecture/ NHibernateBestPractices .aspx )
    • ITArchitect ( www. itarchitect .co.uk )
    • Blog de Scott Guthrie , Project Leader .NET (http://weblogs.asp.net/scottgu/)
    • Mi Blog sobre Arquitecturas y Diseño OO (orientado a .NET...) (metodologiasdesistemas.blogspot.com )
    • Spring.NET (www.springframework.net )
    Jorge Ercoli (http://metodologiasdesistemas.blogspot.com)