Prism框架的Module(模塊化)編程


Prism框架用的是新版本的,Prism7.1。關於其中的變動,感興趣的參考https://www.cnblogs.com/hicolin/p/8694892.html

如何告訴Shell(我們的宿主程序)去Load哪些Module,Prism框架用的是模塊目錄ModuleCatalog,ModuleCatalog包含了可以被APP使用的模塊信息。

方式一:通過配置文件(App.config)創建模塊目錄(ModuleCatalog)

1、新建Prism Blank App(WPF) 項目:BlankApp7

BlankApp7處鼠標右鍵——添加——新建項——應用程序配置文件,App.config

2、新建Prism Module(WPF)項目:ModuleA

3、ModuleA中有個ModuleAModule.cs文件,實現ViewA與主窗體的ContentRegion的關聯(四種方式的ModuleAModule.cs內容都一樣)

using ModuleA.Views;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;

namespace ModuleA
{
    public class ModuleAModule : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider) 
        {
            var regionManager = containerProvider.Resolve<IRegionManager>(); regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA)); //viewA與ContentRegion進行關聯
        }
        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            
        }
    }
}

App.xaml.cs目錄創建於配置文件

using BlankApp7.Views;
using Prism.Ioc;
using Prism.Modularity;
using System.Windows;

namespace BlankApp7
{
    public partial class App
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
        }
        protected override IModuleCatalog CreateModuleCatalog() { return new ConfigurationModuleCatalog(); //目錄創建於配置文件
 }
    }
}

配置文件App.config,可知有一個名為ModuleAModule的Module,集合於ModuleA.dll中,startupLoaded是否在啟動時就加載(顯示)。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
    </configSections>
    <modules>        
        <module assemblyFile="ModuleA.dll" moduleType="ModuleA.ModuleAModule, ModuleA" moduleName="ModuleAModule" startupLoaded="True" />
    </modules>
</configuration>

4、由於BlankApp7要加載ModuleA,所以要引用ModuleA生成的dll。

ModuleA處鼠標右鍵——生成,ModuleA的bin文件夾中就會出現ModuleA.dll

BlankApp7處鼠標右鍵——添加——引用,瀏覽,找到ModuleA.dll(不建議復制粘貼dll到BlankApp7的bin目錄,因為如果重新生成ModuleA.dll,那么新的dll不會出現在BlankApp7的bin目錄,依舊是拷貝的舊dll)

運行結果如圖

 方式二:Code方法,調用AddModule()

仿照方式一創建項目BlankApp8、ModuleA,只需要更改ModuleAModule.cs、App.xaml.cs。其他文件默認不動。

ModuleAModule.cs,內容與方式一一樣

App.xaml.cs

using BlankApp8.Views;
using Prism.Ioc;
using Prism.Modularity;
using System.Windows;

namespace BlankApp8
{
    public partial class App
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
        }
        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) //配置模塊目錄
 { moduleCatalog.AddModule<ModuleA.ModuleAModule>(); //使用AddModule方法
 }
    }
}

運行時,依然按照方式一的第4步驟生成並引用dll。

 方式三:指定dll所在目錄的方式,因此就不用按照方式一的第4步驟生成並引用dll了。

與方式二一樣,只需要更改兩個文件ModuleAModule.cs、App.xaml.cs。ModuleAModule.cs內容與方式一一樣。

App.xaml.cs指定要加載的dll的目錄

using BlankApp8.Views;
using Prism.Ioc;
using Prism.Modularity;
using System.Windows;

namespace BlankApp8
{
    public partial class App
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
        }
        protected override IModuleCatalog CreateModuleCatalog() { //return new DirectoryModuleCatalog() { ModulePath = @"./" }; //當前目錄,即BlankApp8\BlankApp8\bin\Debug。需拷貝ModuleA.dll到當前目錄中
            return new DirectoryModuleCatalog() { ModulePath = @"C:\Users\jv\source\repos\BlankApp8\ModuleA\bin\Debug" };//不拷貝ModuleA.dll,使用絕對目錄
 }
    }
}

方式四:加載模塊的方式,與方式一同樣可以實現內容的顯示與否。

只需要更改兩個文件ModuleAModule.cs、App.xaml.cs。ModuleAModule.cs內容與方式一一樣。

App.xaml.cs

using BlankApp8.Views;
using ModuleA; //引入ModuleA
using Prism.Ioc;
using Prism.Modularity;
using System.Windows;

namespace BlankApp8
{
    public partial class App
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
        }
        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { var moduleAType = typeof(ModuleAModule); moduleCatalog.AddModule(new ModuleInfo() { ModuleName = moduleAType.Name, ModuleType = moduleAType.AssemblyQualifiedName, InitializationMode = InitializationMode.WhenAvailable //顯示View內容 //InitializationMode = InitializationMode.OnDemand //不顯示View內容
 }); }
    }
}

運行時,依然按照方式一的第4步驟生成並引用dll。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM