Prism v2: demande des explications sur les raisons pour lesquelles les modules doivent & # 8220; enregistrer les types de vue avec le shell & # 8221;

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

  •  03-07-2019
  •  | 
  •  

Question

Je suis en train de lire le Les directives de Prism v2 dans lesquelles ils indiquent:

  

Lors de l'initialisation, les modules utilisent le   RegionManager pour localiser les régions du   shell et ajouter une ou plusieurs vues à   ces régions ou enregistrent un ou plusieurs   afficher les types à créer dans ces   régions

Je comprends que des vues sont ajoutées dans le programme d'amorçage, par exemple. dans la méthode GetModuleCatalog ():

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

Mais que signifie enregistrer un type de vue? Pourquoi les modules doivent-ils "enregistrer un type de vue"? avec le shell s’ils ont déjà "ajouté leurs vues" comme avec le code ci-dessus?

Était-ce utile?

La solution

Dans votre code, vous n’ajoutez pas des vues au démarrage, mais des modules au ModuleCatalog. Un module du monde de l'interface utilisateur CAB / Prism / Composite peut contenir des vues, mais il fournit souvent une sorte de service complémentaire que d'autres modules peuvent utiliser. Par exemple, supposons que j'ai un shell qui utilise un gestionnaire d'ancrage pour afficher des vues. Je veux que les modules utilisent une API IDockingWindowService pour afficher / masquer la fenêtre. Je veux que l'implémentation du service soit facilement interchangeable. Je crée donc un module contenant un service appelé DockingWindowService et implémentant IDockingWindowService. J'enregistre ce module auprès de ModuleCatalog.

Le flux de travail de l'infrastructure composite créerait ce service, l'enregistrerait avec le programme d'amorçage et tous les modules chargés après ce fait pourraient utiliser le service IDockingWindowService. Ce service n'est pas une vue, mais une logique. je voulais juste souligner cette distinction. Cela étant dit, un module peut contenir 0 ou plusieurs vues (ou, à titre de simplification, UserControls). L'unité de l'interface utilisateur est la vue. Un module est davantage un concept de groupement logique et / ou d'interface utilisateur.

Revenons à votre question: la documentation indique que si vous utilisez des régions pour afficher vos vues, vous pouvez enregistrer les types de vue dans la région. Chaque fois que la région est affichée, la vue est automatiquement créée à l'aide du conteneur Unity.

Autres conseils

Lorsque vous enregistrez un type avec une région, ce type est créé chaque fois que la région est affichée.

Si vous localisez une région puis que vous y ajoutez des vues, vous n'avez pas besoin d'enregistrer un type avec cette vue, car vous faites le travail plutôt que de laisser le responsable de la région le faire.

Dans votre exemple, vous ajoutez un module à des modules d'application, que je considère comme un chargement de bibliothèque avec une classe implémentant une interface IModule (classe d'initialiseur de module)

Chaque fois que la méthode Intialize de cette classe d'initialiseur de module est invoquée, le module enregistre ses propres mappages IoC et autres éléments nécessaires au fonctionnement du module.

Un module peut désormais charger une vue lors de l'initialisation du module (ajout d'un élément de menu ou d'un élément de la barre d'outils, etc.). Cela couvrirait "l'ajout d'une ou plusieurs vues pendant l'initialisation du module". une partie de votre question.

En plus d'afficher les vues lors de l'initialisation, le module contient généralement plus de vues qui ne doivent pas être affichées au moment du chargement du module, mais généralement en réaction à un événement (l'événement UserLoogingIn peut nécessiter l'affichage de la connexion vew). Pour que Prism montre cette vue, tous les mappages entre la vue et le modèle de présentation doivent déjà être définis dans l’initialiseur de module.

Quelque chose comme ça (basé sur le style de code RI)

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

Ainsi, l'initialiseur de module enregistre les vues en définissant les mappages nécessaires à l'unité pour résoudre la vue lors de l'opération de chargement de la vue par le gestionnaire de région.

Dans le code ci-dessus, vous remplissez un catalogue de modules. Cela fait partie de la modularité dans Prism. J'ai un screencast l'expliquant ici . En gros, vous dites à Prism de charger un fichier .dll ou .xap. Ces " modules " peut contenir 2 éléments: les services (pensez aux implémentations d’interfaces) et les vues.

Lorsqu'un module (généralement un fichier .dll ou .xap) est chargé, une méthode Initialize est appelée pour vous permettre d'enregistrer des services et des régions:

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
}

Notez l'enregistrement de la vue:

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

Vous pourriez enregistrer un nombre quelconque de vues ici dans la fenêtre Initialiser. Et dans n’importe quelle initialisation pour n’importe quel module (encore une fois, habituellement un .xap ou .dll).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top