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>
}“`
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, inyecteIModuleManager
en su clase App utilizando la inyección de dependencia.Luego, en su método
OnExit
, puede llamar aIModuleManager.Modules
para obtener todos los módulos cargados e iterar a través de las vistas registradas de cada módulo utilizando la interfazIContainerProvider
. Aquí hay un ejemplo de implementación: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.