• Introducción a Composite UI Application Block (CAB) II

    Published by mconverti on September 3rd, 2007 6:51 pm under CAB

    5 Comments

    Comienzo de la aplicación CAB

    La base de toda aplicación CAB es la clase CABApplication. Posee el código para, entre otras cosas, agregar servicios globales, construir, inicializar y ejecutar el RootWorkItem, cargar todos los módulos especificados en el catálogo, comenzar la aplicación iniciando el loop de mensajes (eso dependerá del tipo de aplicación que sea) y por último ejecutar el código de dispose (cuando esta finaliza). Sobre esta clase se monta la jerarquía de clases que se muestra en la Figura 1.

    457x375.aspx

    Figura 1

    Jerarquía de clases del Shell.



    ·         CabApplication: Esta clase, como se mencionó anteriormente, se encarga de administrar los pasos fundamentales de la inicialización de Composite UI Application Block. Es utilizada por todos los tipos de shell y sólo requiere como parámetro la clase que se usará como RootWorkItem.

    ·         CabShellApplication: Se usa en aplicaciones que necesitan un shell. Incorpora dos métodos virtuales BeforeShellCreated() y AfterShellCreated(). Estos métodos son llamados antes y después de la creación del shell con el RootWorkItem.

    ·         WindowsFormsApplication: Es usada en todos los shell que utilizan Windows Forms. Incorpora algunas tareas a la etapa de inicialización, como agregar Builder Strategies que manejará el ObjectBuilder y registrar un visualizador, entre otras cosas.

    ·         FormShellApplication: Sobrescribe el método Start() de CABApplication y llama al método Application.Run() (requerido por los Windows Forms) pasándole el shell. Esta clase es usada por aplicaciones que necesitan mostrar un formulario prinicipal.


    ·         ApplicationContextApplication: Esta clase se usa en aplicaciones de Windows que no necesitan mostrar un shell durante la etapa de inicialización. Además del RootWorkItem, esta clase recibe como parámetro una clase que herede de ApplicationContext. La clase ApplicationContext se encarga de controlar la aplicación principal y las circunstancias que causan la salida del loop de mensajes. Se usa en aplicaciones que se cargan como plug-ins en otros sistemas como por ejemplo los Office Add-in. También sobrescribe el método Start() de CABApplication y llama a Application.Run() pero le pasa el ApplicationContext antes mencionado.

    Toda aplicación CAB comienza en el método Run() de la clase CABApplication. La Figura 2 ilustra las prinicipales tareas del flujo de inicialización.

     500x339.aspx

    Figura 2

    Inicialización de CAB.

    • Se crea el ObjectBuilder y se le agregan las Builder Strategies.
    • Se crea e inicializa el RootWorkItem. Esta instancia será usada desde todos los módulos para crear objetos y acceder a partes del shell (Workspace y UIElements).
    • Se agregan todos servicios al RootWorkItem
    • Se llama al servicio de autenticación (Authentication) el cual es responsable de verificar el rol del usuario en el dominio de la aplicación.
    • Se buscan y cargan los módulos especificados en el Catálogo en la secuencia correcta. Se busca una clase que implemente la interfaz IModule.
    • Se cargan los servicios propios de cada módulo y se llama al método Load() de la clase de entrada.
    • Se ejecuta el RootWorkItem invocando a su método Run().
    • Se invoca el método Start() encargado de mostrar el formulario principal. Este método retorna el control solo cuando la aplicación finaliza (FormShellApplication) o cuando el contexto en la que estaba finaliza (ApplicationContextApplication).

    • Al finalizar el método Start() se hace un dispose.

    En el siguiente informe se explicará el proceso de carga de un módulo y cómo aplicar el patrón Model-View-Presenter (MVP) con Composite UI Application Block.

  • 5 Comments:

    1. http:// said on September 7, 2007:

      Hola Mariano.

      Quería felicitarte por estos dos estupendos artículos que has escrito acerca de CAB y animarte a que sigas con la serie.

      Yo acabo de empezar hace unos días y esto es lo único que he encontrado en español. Seguro que este blog le va a interesar a un montón de gente.

      Un saludo.

    2. lucasontivero said on September 8, 2007:

      Mariano, muy buenos los artículos. Espero que los continues porque no es facil mantener la constancia en esto y te lo digo por experiencia propia.

      Pero este no es comentario solo para decirte “felicitaciones” sino para comentarte que es lo que me gustó, lo que me pareció distintivo fueron los gráficos tanto el diagrama de clases como los otros esquemas.

      Un saludo.

    3. http:// said on September 17, 2007:

      Muchas gracias por los buenos comentarios. Estoy muy contento de que les hayan gustado mis artículos.
      Espero que los próximos sigan siendo útiles para quienes esten interesados en aprender CAB.
      Cualquier sugerencia o crítica que deseen hacer siempre es bienvenida…

    4. Morgado said on May 21, 2009:

      hola , creo que estan muy buenos tus articulos pero me queda una duda a la hora de utilizar el servicio de autentificacion como puedo hacerlo para mantener la seguridad

    5. Mariano Converti said on May 25, 2009:

      Hola Morgado:
      El servicio de autenticacion debe encargarse de recolectar toda la información necesaria para autenticar/identificar a los usuarios. Se espera que después de invocar al servicio, la policy Principal sea setteda. Esto permite que otros servicios y componentes que corren despues puedan adquirir este valor y llamar al método IsInRole para validar cualquier permiso requerido (esto es lo que hacen los servicios que se encargan de enumerar y cargar modulos).
      CAB provee la clase WindowsPrincipalAuthenticationService como implementacion default de este servicio. Esta implementacion settea en el CurrentDomain la principal policy del usuario de Windows que esta corriendo la aplicacion.
      Durante el startup de la aplicacion, CAB se encarga de invocar al metodo Authenticate del servicio de autenticacion como primer paso. De esta forma en el momento de carga de modulos, solo se cargan los que esten permitidos por el rol del usuario (ya que en el ProfileCatalog.xml se pueden asignar roles requeridos a cada modulo).
      CAB permite crear y registrar una implementacion custom de este servicio. Un ejemplo posible es la clase SimpleWinFormAuthenticationService que se encuentra en la BankBranchWorkbench reference implementation. Esta implementacion le solicita credenciales al usuario (user name y password), crea una nuevo Principal con todos sus roles y se lo asigna a la propiedad Thread.CurrentPrincipal. De esta forma los modulos que se cargan en la aplicacion son solo los permitidos par el usuario loggeado.

      Espero que te sea util mi respuesta. Saludos.
      Mariano Converti

    Leave a comment

    Your email address will not be published.