es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo iterar a través de todas las vistas de todos los módulos agregados al catálogo de Unity.

Tengo una aplicación modular WPF/Prism/Unity.
Los módulos se agregan al catálogo en el código de la App como:

protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<ModuleA>();
moduleCatalog.AddModule<ModuleB>();
moduleCatalog.AddModule<ModuleC>();
}

Cada módulo tiene algunas Vistas – UserControls. Quiero agregar una interfaz a algunas de esas definiciones de vista:

public interface IAppOnExitAware
{
void SaveViewSettings();
}

Y luego declarar mis vistas así:

“`public partial class ExistingOrderView : UserControl, IAppOnExitAware

<pre><code><br />Luego en la aplicación, quiero anular OnExit para iterar por todas las vistas. Y si es "IAppOnExitAware", llamar a su "SaveViewSettings()". Algo como:

</code></pre>

foreach(var v in COLLECTION)
{
if(v is IAppOnExitAware)
{
((IAppOnExitAware)v).SaveViewSettings();
}
}
“`

¿Cómo puedo obtener esa “COLLECTION” de vistas en todos los módulos del catálogo para iterar a través de ellas?

Actualización: cada módulo registra vistas así:

“`public class ModuleA : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}

<pre><code>public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<Page01View, Page01ViewModel>();
}
</code></pre>

}“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener una colección de vistas de todos los módulos en el catálogo, puede utilizar la interfaz IModuleManager proporcionada por Prism. Primero, inyecte IModuleManager en su clase App utilizando la inyección de dependencia.

    Luego, en su método OnExit, puede llamar a IModuleManager.Modules para obtener todos los módulos cargados e iterar a través de las vistas registradas de cada módulo utilizando la interfaz IContainerProvider. Aquí hay un ejemplo de implementación:

    public partial class App : PrismApplication
    {
        private readonly IContainerProvider _containerProvider;
        private readonly IModuleManager _moduleManager;
    
        public App(IContainerProvider containerProvider, IModuleManager moduleManager)
        {
            _containerProvider = containerProvider;
            _moduleManager = moduleManager;
    
            // ...
        }
    
        protected override void OnExit(ExitEventArgs e)
        {
            base.OnExit(e);
    
            // Iterar a través de todos los módulos cargados
            foreach (var module in _moduleManager.Modules)
            {
                // Obtenga el contenedor para el módulo
                var moduleContainer = _containerProvider.GetContainer();
    
                // Iterar a través de todas las vistas registradas en el módulo
                foreach (var viewType in moduleContainer.GetRegisteredTypes()
                    .Where(t => typeof(UserControl).IsAssignableFrom(t)))
                {
                    // Crea una instancia de la vista
                    var view = (UserControl)moduleContainer.Resolve(viewType);
    
                    // Compruebe si la vista implementa IAppOnExitAware
                    if (view is IAppOnExitAware appOnExitAwareView)
                    {
                        appOnExitAwareView.SaveViewSettings();
                    }
                }
            }
        }
    
        // ...
    }
    

    Tenga en cuenta que en el ejemplo anterior, solo iteramos a través de vistas UserControl registradas en el contenedor. Si sus vistas tienen una clase base diferente, deberá ajustar este código en consecuencia.

Comments are closed.