Prism v2: cercare chiarimenti sul perché i moduli debbano "registrare i tipi di vista con la shell"

StackOverflow https://stackoverflow.com/questions/614069

  •  03-07-2019
  •  | 
  •  

Domanda

Sto leggendo il Linee guida per Prism v2 in cui dichiarano:

  

Durante l'inizializzazione, i moduli usano il   RegionManager per individuare le regioni nel file   shell e aggiungi una o più visualizzazioni a   quelle regioni o registrano una o più   visualizza i tipi da creare all'interno di questi   regioni

Comprendo che le visualizzazioni vengono aggiunte nel bootstrapper ad es. nel metodo GetModuleCatalog ():

protected override IModuleCatalog GetModuleCatalog()
{
    ModuleCatalog catalog = new ModuleCatalog()
        .AddModule(typeof(HelloWorldModule.HelloWorldModule));
    return catalog;
}

Ma cosa significa registrare un tipo di vista? Perché i moduli devono " registrare un tipo di vista " con la shell se sono già " aggiungendo le loro viste " come con il codice sopra?

È stato utile?

Soluzione

Nel tuo codice non stai aggiungendo Visualizzazioni al bootstrapper ma Moduli al ModuleCatalog. Un modulo nel mondo CAB / Prism / Composite UI può contenere viste, ma molte volte fornisce una sorta di servizio aggiuntivo che altri moduli possono utilizzare. Ad esempio, supponiamo che io abbia una Shell che utilizza un gestore di docking per visualizzare le viste. Voglio che i moduli utilizzino un API IDockingWindowService per mostrare / nascondere la finestra. Voglio che l'implementazione del servizio sia facilmente intercambiabile, quindi creo un modulo che contiene un servizio chiamato DockingWindowService e implementa IDockingWindowService. Registro questo modulo con ModuleCatalog.

Il flusso di lavoro del framework composito creerebbe questo servizio, lo registrerà con il bootstrapper e tutti i moduli caricati dopo questo fatto sarebbero in grado di utilizzare IDockingWindowService. Questo servizio non è una vista, ma una logica; volevo solo sottolineare questa distinzione. Detto questo, un Modulo può contenere 0 o più Viste (o, come semplificazione, UserControls). L'unità dell'interfaccia utente è la vista. Un modulo è più un concetto di raggruppamento logico e / o dell'interfaccia utente.

Torna alla tua domanda particolare: ciò che la documentazione dice è che se usi le Regioni per visualizzare le tue Viste, puoi registrare i tipi di Vista con la Regione. Ogni volta che viene mostrata la regione, costruirà automaticamente la vista usando il contenitore Unity.

Altri suggerimenti

Quando registri un tipo con una Regione, quel tipo viene istanziato ogni volta che viene mostrata la regione.

Se si individua una regione e quindi si aggiungono viste ad essa, non è necessario registrare un tipo con quella vista, poiché si sta facendo il lavoro piuttosto che lasciare che sia il gestore della regione a farlo.

Nel tuo esempio stai aggiungendo un modulo ai moduli dell'applicazione che ritengo sia un caricamento della libreria con classe che implementa l'interfaccia IModule (classe di inizializzazione del modulo)

Ogni volta che viene invocato il metodo Intialize di quella classe di inizializzazione del modulo, il modulo registra i propri mapping IoC e altre cose necessarie per il funzionamento del modulo.

Ora un modulo può caricare una vista durante l'inizializzazione del modulo (aggiungendo la voce di menu o la barra degli strumenti ecc.). Ciò coprirebbe "l'aggiunta di una o più viste durante l'inizializzazione del modulo" parte della tua domanda.

Oltre a mostrare le viste durante l'inizializzazione, il modulo di solito contiene più viste che non devono essere mostrate al momento del caricamento del modulo ma invece di solito in reazione ad un evento (l'evento UserLoogingIn potrebbe richiedere la visualizzazione del velo di accesso per essere mostrato). Affinché Prism mostri che la visualizzazione di tutte le mappature tra la vista e il modello di presentazione deve essere definita già nell'inizializzazione del modulo.

Qualcosa del genere (basato sullo stile di codice RI)

this.container.Register (); this.container.Register ();

Quindi, l'inizializzatore del modulo registra le viste definendo i mapping necessari per l'unità per risolvere la vista durante l'operazione di gestione della vista di caricamento della vista.

Nel codice sopra, stai compilando un catalogo di moduli. Questo fa parte di come funziona la modularità in Prism. Ho uno screencast che lo spiega qui . In sostanza, stai dicendo a Prism di caricare un file .dll o .xap. Questi "moduli" può contenere 2 cose: servizi (pensa alle implementazioni delle interfacce) e viste.

Quando viene caricato un modulo (di solito un file .dll o .xap), viene chiamato un metodo Initialize in cui è possibile registrare servizi e regioni:

public class ModuleA : IModule
{
    IRegionManager _regionManager;
    IUnityContainer _container;

    public ModuleA(IRegionManager regionManager, IUnityContainer container)
    {
        _regionManager = regionManager;
        _container = container;
    }

    #region IModule Members

    public void Initialize()
    {
        _container.RegisterType<ICompanyService, CompanyService>();
        _regionManager.RegisterViewWithRegion("MainRegion", typeof(ModuleAView));

    }

    #endregion
}

Nota la registrazione della vista:

_regionManager.RegisterViewWithRegion("MainRegion", typeof(ModuleAView));

Potresti registrare un numero qualsiasi di visualizzazioni qui in Inizializza. E in qualsiasi inizializzazione per qualsiasi modulo (di nuovo, di solito un .xap o .dll).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top