2014-01-24 129 views
2

我在PRISM中實現應用程序,需要從dll文件動態導入模塊。 我設法做到了 - 他們正在導入,但我無法顯示它。 我決定創建一個特殊的模塊來封裝它 - 讓我們稱之爲ModuleDock。 因此,我們有這樣的事情:在棱鏡模塊內顯示棱鏡模塊

Bootstrapper.cs:

class Bootstrapper : UnityBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     return Container.Resolve<Shell>(); 
    } 

    protected override void InitializeShell() 
    { 
     base.InitializeShell(); 

     Application.Current.MainWindow = (Window)Shell; 
     Application.Current.MainWindow.Show(); 
    } 

    protected override IModuleCatalog CreateModuleCatalog() 
    { 
     var modules = new DirectoryModuleCatalog 
     { 
      LoadSubdirectories = true, 
      ModulePath = @"C:\Modules" 
     }; 

     modules.AddModule(typeof(ModuleDockModule)); 

     return modules; 
    } 
} 

Shell.xaml:

<ContentControl regions:RegionManager.RegionName="ModuleDockModule" /> 

ModuleDockModule.cs(在ModuleDock項目):

public class ModuleDockModule : IModule 
{ 
    private readonly IRegionManager _regionManager; 
    private readonly IUnityContainer _unityContainer; 

    public void Initialize() 
    { 
     RegisterIoc(); 
     if (_regionManager.Regions.ContainsRegionWithName("ModuleDockModule")) 
     { 
      _regionManager.RegisterViewWithRegion("ModuleDockModule", typeof(ModuleDockView)); 
     } 
    } 

    public ModuleDockModule(IRegionManager regionManager, IUnityContainer unityContainer, IRegionViewRegistry regionViewRegistry) 
    { 
     _regionManager = regionManager; 
     _unityContainer = unityContainer; 
    } 

    private void RegisterIoc() 
    { 
     _unityContainer.RegisterType<IModuleDockView, ModuleDockView>(); 

     _unityContainer.RegisterType<IModuleDockViewModel, ModuleDockViewModel>(); 
    } 

}

和加載模塊的最後一個:

[Module(ModuleName = "TestModule", OnDemand = false)] 
public class TestModuleModule : IModule 
{ 
    private readonly IRegionManager _regionManager; 
    private readonly IUnityContainer _unityContainer; 

    public void Initialize() 
    { 
     RegisterIoc(); 
     if (_regionManager.Regions.ContainsRegionWithName("TestModule")) 
     { 
      _regionManager.RegisterViewWithRegion("TestModule", typeof(TestView)); 
     } 
    } 

    public TestModuleModule(IRegionManager regionManager, IUnityContainer unityContainer) 
    { 
     _regionManager = regionManager; 
     _unityContainer = unityContainer; 
    } 

    private void RegisterIoc() 
    { 
     _unityContainer.RegisterType<ITestView, TestView>(); 

     _unityContainer.RegisterType<ITestViewModel, TestViewModel>(); 
    } 
} 

出於測試目的,我創建了行XAML的:

<ContentControl regions:RegionManager.RegionName="TestModule" /> 

你能告訴我,爲什麼這行顯示TestModule在Shell.xaml ,但不要在ModuleDockView.xaml中顯示它?

請記住,在最後階段,我必須使用不同的號碼通過我的平臺的其他用戶提供的未知的模塊,所以我不能做任何事情靜態(如模塊名稱或初始化)。 提前謝謝!

+0

爲了確認,你問爲什麼TestModule不ModuleDockView顯示,而是在外殼?這將取決於您在哪個Xaml頁面中使用內容Control定義該區域。關於靜態初始化,它們將在每個模塊內進行。所以你不需要擔心這一點。我認爲做一個枚舉類定義的默認RegionNames其中每個人都知道他們的。 – GOstrowsky

+0

@GOstrowsky - no。TestModule沒有顯示在ModuleDockView中 - 但我知道加載它的一切都是正確的,因爲如果我將相同的區域放在Shell.xaml中,並將其從ModuleDockView.xaml中移除(出於測試目的),它就會顯示出來。 從其他方面 - 我使用的類與靜態字符串的區域名稱,但對於堆棧我爲了更好的可讀性使用文本值的示例。 – Zozo

+1

謝謝你的解釋。問題將出現在Module的加載順序上,因爲*** TestModule ***依賴於*** ModuleDockModule ***區域的*** ModuleDockModule ***。你可以檢查*** TestModule ***是否正在初始化*** ModuleDockModule ***之前?如果是這樣,那麼您需要在模塊名稱屬性下添加一個依賴項屬性到*** TestModuleModule ***類中,作爲** [ModuleDependency(「ModuleDockModule」)] **。問候。 – GOstrowsky

回答

4

根據您所描述的代碼時,TestModule模塊具有ModuleDockModule,因爲這是定義了TestModule的意見將被登記入區的模塊依賴。

因此,你需要確保ModuleDockModule之前TestModule這將依賴於它的任何其他模塊進行初始化。爲了做到這一點,你就需要在TestModuleModule類中聲明的依賴屬性,正確的類定義的上方,如下所示:

[Module(ModuleName = "TestModule", OnDemand = false)] 
[ModuleDependency("ModuleDockModule")] 
public class TestModuleModule : IModule 
{ ... 

有關爲模,你可以參考以下MSDN棱鏡指南的詳細信息章:

我希望這有助於你的問候。