2016-03-28 8 views
0

私は2つのモジュールを備えたプリズムシェルを持っています。 1つのモジュールはメインアプリケーションモックMainAppMockであり、他のモジュールはそのメインシステムが領域として使用しているものであると仮定されています。ModuleOne。 1つで、百万のモジュールになる可能性があります。WPFプリズムモジュールの初期化

問題は、プリズムの仕組みを理解することです。私がBootstrapperMainWindow.xamlファイルの名前空間と呼ばない限り、MainAppModuleは正しく初期化されます。

私の質問:この名前空間を呼び出すときにモジュールが実行時にロードされているため、既にロードされているためにPrismがロードされないためですか?実際に何が起こっているのですか?

シェル:

class Bootstrapper : NinjectBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     return Kernel.Get<MainWindow>(); 
    } 

    protected override void InitializeShell() 
    { 
     Application.Current.MainWindow = (Window)Shell; 
     Application.Current.MainWindow.Show(); 
    } 

    protected override IModuleCatalog CreateModuleCatalog() 
    { 
     return new DirectoryModuleCatalog 
     { 
      ModulePath = AppDomain.CurrentDomain.BaseDirectory 
     }; 
    } 
} 

MainAppMockとModuleOneは、名前以外は同じです。

ModuleOneクラス:

[Module(ModuleName = "ModuleOne.Module")] 
public class Module : IModule 
{ 
    private readonly IRegionManager _regionManager; 
    private readonly IKernel _kernel; 

    public Module(IRegionManager regionManager, IKernel kernel) 
    { 
     _regionManager = regionManager; 
     _kernel = kernel; 
    } 

    public void Initialize() 
    { 
    } 
} 

問題はここにあります。

<Window x:Class="PrismTest.MainWindow" 
    xmlns:mainAppMock="clr-namespace:MainAppMock;assembly=MainAppMock" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <mainAppMock:MainUserControl /> 
</Grid> 

注:BootstrapperMainWindowでは前述したように、私はmainAppMock名前空間を削除する場合は正常に動作します。

答えて

1

これについて数人で議論したところ、1つの結論に達しました。

MainAppMockは、namespace:MainUserControlShellMainWindowと呼びます。 Prismのブートストラップを実行すると、AppDomain.CurrentDomain.BaseDirectoryに入り、DLLを検索してIModuleから継承するものを探します。 MainAppMockが実行されますが、既にロードされています。すでにロードされているDLLをロードするのは意味がありません。したがって、再ロードされず、Moduleは実行されません。

DLLがロードされるときにMainAppMock初期化メソッドが実行されていることに言及する価値があります。実際にPrism Moduleのコードを実行することはできますが、これはお勧めできません。

1

プリズムはModulesShellです。 ShellがTV-Setであるとしましょう。したがって、ModulesはTV-Setのチャンネルになります。

protected override IModuleCatalog CreateModuleCatalog() 
{ 
    ModuleCatalog catalog = new ModuleCatalog(); 
    catalog.AddModule(typeof(ModuleZooModule));//Channel about Zoo 
    catalog.AddModule(typeof(ModuleSportModule));//Channel about Sport 
    catalog.AddModule(typeof(ModuleProgrammingModule));//Channel about Programming 
    return catalog; 
} 

を、通常Shellは次のようになります:プログラムの開始時に(あなたがターンオンテレビ・セット)法protected override IModuleCatalog CreateModuleCatalog()で、あなたは(TV-セットあなたの検索のチャンネルをロードする)Modulesをロードしている

<DockPanel >    
    <ContentControl Margin="5" 
     prism:RegionManager.RegionName="{x:Static inf:RegionNames.ContentRegion}" 
     prism:RegionManager.RegionManager="{Binding RegionManager}"/> 
</DockPanel> 

prism:RegionManager.RegionName="{x:Static inf:RegionNames.ContentRegion}"は、Shell(TV-Set)にModule(チャンネルのビデオストリーム)を注入する必要があります。Prismに表示されます。

しかし、あなたの場合には、そのようなものを使用する資格はない:

<Grid> 
    <mainAppMock:MainUserControl /> 
</Grid> 

PrismはどこModule(いくつかのチャネル)を知らないように、あなたのShell(TV-セット)で示すことができます。

+0

答えの3番目の部分は正しくありません。 Prismは、リージョン内で呼び出されているかどうかにかかわらず、IModuleを実装しているモジュールをロードします。さらに、リージョンは単にModuleクラスではなくビューを呼び出すだけです。 私は自分のモジュールがAppDomain.CurrentDomain.BaseDirectoryに配置されていることをPrismに伝えているので、既に存在していることが分かります。 – AzzamAziz

+0

@AzzamAzizええ、 'Prism'は' CreateModuleCatalog'の中にコードを書くと 'Modules'を読み込みます。しかし、Prismは、 'Module'が' Shell'で 'RegionManager'なしでどこに表示されるべきか分かりません。 – StepUp

+0

私はまだそれを表示しようとしていないので、いいです、私はそれが読み込まれていることを確認しようとしています。問題はそれが表示されていないということではありません。それは読み込まれていないということです。 – AzzamAziz