2009-03-05 7 views
0

lese ich durch die Prism v2 guidelines, in dem „Ansichtstypen mit dem Shell-Register“ stellen sie fest:Prism v2: Bitte um Klärung, warum Module müssen

Während der Initialisierung Module verwenden, um die RegionManager zu lokalisieren Regionen in der Schale und einer oder mehr Ansichten zu jene Regionen oder Register eines oder mehr innerhalb dieser Regionen Ansichtstypen werden erstellt hinzuzufügen

Ich verstehe, dass die Ansichten in dem Bootstrap-Programm hinzugefügt werden, z.B. in der GetModuleCatalog() Methode:

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

Aber was bedeutet es, einen Ansichtstyp zu registrieren? Warum müssen Module "einen Ansichtstyp" mit der Shell registrieren, wenn sie bereits "ihre Ansichten hinzufügen" wie beim obigen Code?

Antwort

5

In Ihrem Code den Sie hinzufügen, nicht Blick auf das Bootstrap-Programm, sondern Module zum ModuleCatalog. Ein Modul in der CAB/Prism/Composite UI-Welt kann Ansichten enthalten, aber oft bietet es eine Art Zusatzdienst, den andere Module verwenden können. Angenommen, ich habe eine Shell, die einen Docking-Manager verwendet, um Ansichten anzuzeigen. Ich möchte, dass Module einen API IDockingWindowService verwenden, um Fenster ein-/auszublenden. Ich möchte, dass die Service-Implementierung leicht austauschbar ist, also erstelle ich ein Modul, das einen Service namens DockingWindowService enthält und IDockingWindowService implementiert. Ich registriere dieses Modul beim ModuleCatalog.

Der Composite-Framework-Workflow würde diesen Dienst erstellen, ihn beim Bootstrapper registrieren und alle Module, die nach diesem Fakt geladen werden, könnten den IDockingWindowService verwenden. Dieser Dienst ist keine Sicht, sondern Logik; Ich wollte nur auf diese Unterscheidung hinweisen. Davon abgesehen kann ein Modul 0 oder mehr Views enthalten (oder vereinfacht UserControls). Die UI-Einheit ist die Ansicht. Ein Modul ist eher ein Logik- und/oder UI-Bündelungskonzept.

Zurück auf Ihre Frage: Was ist die Dokumentation sagt, ist, dass Sie, wenn Sie Regionen verwenden, um Ihre Ansichten angezeigt werden, die anzeigen Typen mit der Region registrieren. Wenn die Region angezeigt wird, wird automatisch die Ansicht mit dem Unity-Container erstellt.

2

Wenn Sie einen Typ mit einer Region registrieren, wird dieser Typ immer dann instatiert, wenn die Region angezeigt wird.

Wenn Sie eine Region suchen und dann fügen Sie Ansichten, um es Sie nicht brauchen einen Typ mit dieser Ansicht zu registrieren, da Sie die Arbeit tun lassen, anstatt die Region Manager tun es.

+0

Ich würde in "AddModule" denken, dass wir "ein Modul hinzufügen" würden. Stattdessen fügen wir einen Modultyp hinzu. In der Anwendung, in der ich mit Modulen gearbeitet habe, hatten wir Methoden wie AddModule und tatsächlich haben wir tatsächlich die Module selbst hinzugefügt. Warum fügen wir einen "Modultyp" statt eines Moduls selbst hinzu? –

+0

ModuleCatalog enthält kein Modul, das Informationen über das Modul enthält. Ich würde vorschlagen, DI/IoC zu verstehen, bevor Sie mit ModuleCatalog fortfahren, da Sie das verstehen müssen, bevor Sie verstehen, warum Sie nicht mit Modulen und nur Modultypen umgehen. –

0

In Ihrem Beispiel Sie Modul Anwendungsmodule hinzufügen, was ich davon halten als Laden von Bibliothek-Klasse Implementierung IModule Schnittstelle (Modul initializer Klasse)

Jedes Mal, wenn intialize Methode dieses Moduls initializer Klasse aufgerufen wird, , Modulregister, eigene IoC-Mappings und andere Dinge, die für die Modularbeit benötigt werden.

Jetzt kann ein Modul eine Ansicht während der Modulinitialisierung laden (Hinzufügen des Menüelements oder der Werkzeugleiste usw.). Das würde das "Hinzufügen von einer oder mehreren Ansichten während des Moduls Initialisierung" Teil Ihrer Frage abdecken.

Neben den Ansichten während der Initialisierung enthält das Modul normalerweise mehr Ansichten, die nicht zum Zeitpunkt des Ladens des Moduls angezeigt werden, sondern normalerweise als Reaktion auf ein Ereignis (UserLoogingIn Event kann eine Anmeldung erforderlich sein). Damit Prism diese Ansicht anzeigen kann, müssen alle Zuordnungen zwischen Ansichts- und Präsentationsmodell bereits im Modulinitialisierer definiert werden.

So etwas wie diese (basierend auf RI-Code-Stil)

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

So würde Modul Initialisierung Ansichten registrieren durch Definition von Zuordnungen benötigt für Einheit, um die Ansicht während der Region Manager-Betrieb der Ladeansicht zu lösen.

0

Im obigen Code füllen Sie einen Modulkatalog aus. Dies ist Teil der Funktionsweise von Modularität in Prism. Ich habe einen Screencast, der es erklärt here. Im Wesentlichen weisen Sie Prism an, eine .dll- oder .xap-Datei zu laden. Diese "Module" können zwei Dinge enthalten: Dienste (denke Implementierungen von Schnittstellen) und Ansichten.

Wenn ein Modul (in der Regel eine DLL oder XAP-Datei) geladen wird, wird ein Initialize-Methode genannt, wo Sie Dienste und Regionen registrieren:

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 
} 

Beachten Sie die Ansicht Anmeldung:

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

Sie könnten hier eine beliebige Anzahl von Sichten im Initialize registrieren. Und in jedem Initialize für jedes Modul (wieder normalerweise eine .xap oder .dll).

Verwandte Themen