Gestión de Servicios Core y Configuración del Contenedor en Prism

El framework Prism fundamenta su arquitectura en una serie de servicios internos diseñados para gestionar la modularidad, la navegación y la comunicación desacoplada. Comprender estos componentes y la forma en que se integran en el contenedor de inyección de dependencias es crucial para construir aplicaciones extensibles y mantenibles.

Servicios Fundamentales de Prism

Prism Library expone interfaces clave que definen el comportamiento del sistema. A continuación, se detallan los servicios esenciales:

  • IModuleManager: Define el contrato para localizar e inicializar los módulos de la aplicación.
  • IModuleCatalog: Repositorio de metadatos que describe los módulos disponibles, sus dependencias y el modo de carga.
  • IModuleInitializer: Se encarga de ejecutar el proceso de inicialización técnica de cada unidad modular.
  • IRegionManager: Gestiona las regiones de la interfaz de usuario, actuando como un catálogo de contenedores visuales donde se inyectan las vistas.
  • IEventAggregator: Implementa un sistema de mensajería basado en el patrón publicación/suscripicón para permitir la comunicación entre componantes sin acoplamiento directo.
  • ILoggerFacade: Una abstracción sobre mecanismos de registro (logging) que permite integrar cualquier librería externa de logs de manera transparente.
  • IServiceLocator: Interfaz que permite la resolución de servicios desde el contenedor, útil cuando se requiere extender las capacidades nativas del framwork.

Personalización del Contenedor en UnityBootstrapper

En implementaciones que utilizan Unity, el UnityBootstrapper ofrece el método CreateContainer. Aunque por defecto devuelve una instancia estándar de UnityContainer, este método virtual permite interceptar y personalizar la instanciación del motor de inyección de dependencias.

Una vez creado el contenedor, el método ConfigureContainer se encarga de registrar los servicios base. Una implementación típica del framework sigue este esquema lógico:

protected virtual void SetupContainer()
{
    // Verificación de registros base
    if (this.DefaultRegistryEnabled)
    {
        RegisterIfMissing<IServiceLocator, UnityServiceLocatorAdapter>(true);
        RegisterIfMissing<IModuleInitializer, ModuleInitializer>(true);
        RegisterIfMissing<IModuleManager, ModuleManager>(true);
        RegisterIfMissing<IRegionManager, RegionManager>(true);
        RegisterIfMissing<IEventAggregator, EventAggregator>(true);
        RegisterIfMissing<IRegionViewRegistry, RegionViewRegistry>(true);
        RegisterIfMissing<IRegionBehaviorFactory, RegionBehaviorFactory>(true);
    }
}

El desarrollador puede extender este comportamiento para inyectar servicios personalizados o sustituir los existentes mediante el método RegisterTypeIfMissing, el cual garantiza que no se dupliquen registros previos. Un ejemplo de configuración personalizada sería el siguiente:

protected override void ConfigureContainer()
{
    base.ConfigureContainer();

    // Registro de servicios de dominio propios
    this.RegisterTypeIfMissing(typeof(ITrackerService), typeof(ModuleTracker), true);
    
    // Inyección de una instancia específica de logging
    this.Container.RegisterInstance<ICustomLogger>(this.internalLogger);
}

Definición de Servicios de Seguimiento Personalizados

Para ilustrar la implementación de un servicio propio, consideremos una interfaz dedicada al monitoreo del ciclo de vida de los módulos. Esta interfaz permite auditar cada etapa, desde la descarga hasta la carga final en memoria.

public interface ITrackerService
{
    void OnModuleConstructed(string name);
    void OnModuleTransferring(string name, long bytesCurrent, long bytesMax);
    void OnModuleReady(string name);
    void OnModuleStartupComplete(string name);
}

En este diseño:

  • OnModuleConstructed: Notifica cuando el constructor del módulo ha sido invocado.
  • OnModuleTransferring: Utilizado en escenarios de despliegue remoto para seguir el progreso de la descarga.
  • OnModuleReady: Indica que el módulo ha pasado la fase de inicialización.
  • OnModuleStartupComplete: Confirma que el módulo está totalmente operativo dentro del ecosistema de la aplicación.

La clase concreta que implemente ITrackerService contendrá la lógica específica para persistir estos datos o reflejarlos en la interfaz de usuario, permitiendo un control granular sobre el estado de los componentes del sistema.

Etiquetas: Prism-Library WPF Unity-Container dependency-injection MVVM

Publicado el 7-23 08:44