Prism框架的Module(模块化)编程

摘要:
Prism框架使用了新版本Prism 7.1.˃//modules˃4.由于BlankApp7需要加载ModuleA,它需要引用ModuleA生成的dll。右键单击ModuleA--generate和ModuleA。dllBlankApp7将出现在ModuleA--add--reference、browse和find ModuleA的bin文件夹中。dll运行结果如图2所示:Code方法,调用AddModule()创建项目BlankApp8和ModuleA,只需更改ModuleAModule。cs和App.xaml.cs。模块模块。cs,具有相同的内容和方法App.xaml.susingBlankApp8.Views;使用棱镜。Ioc;使用棱镜。模块化;使用系统。窗户;namespaceBlankApp8{publicpartialclassApp{protectedoverrideWindowCreateShell(){returnContainer.Resoolve<MainWindow>();}ProtectedoverridevoidRegisterTypes{}protectedoverridevoidConfigureModuleCatalog//配置模块目录{moduleCatalog.AddModule<ModuleA.ModuleModule>();//使用AddModule方法}}}}运行时,仍会根据方法1的步骤4生成并引用dll。与方法2一样,只需更改两个文件ModuleAModule。cs和App。xaml。反恐精英。ModuleAModule的内容和方法。cs相同。

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

Prism框架的Module(模块化)编程第1张

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)

运行结果如图

Prism框架的Module(模块化)编程第2张

 方式二: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 = @"./" }; //当前目录,即BlankApp8BlankApp8inDebug。需拷贝ModuleA.dll到当前目录中
            return new DirectoryModuleCatalog() { ModulePath = @"C:Usersjvsource
eposBlankApp8ModuleAinDebug" };//不拷贝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。

免责声明:文章转载自《Prism框架的Module(模块化)编程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇用video标签流式加载【转载】python接口测试实战-Fiddler、Postman下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android 本地化适配:RTL(right-to-left) 适配清单

本文首发自公众号:承香墨影(ID:cxmyDev),欢迎关注。 一. 序 越来越多的公司 App,都开始淘金海外,寻找更多的机会。然而海外市场千差万别,无论是市场还是用户的使用习惯,都有诸多的不同。 当你接触一款出海 App 的时候,除了需要了解海外 Google Service 的整个生态圈,还要做好不同语言的适配。语言适配最通用的做法就是根据不同系统...

Android应用图标微技巧,8.0系统中应用图标的适配

现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了。三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接着小米、华为、OV等国产手机厂商即将推出的新年旗舰机也会搭载Android 8.0系统。因此,现在已经是时候需要让我们的应用程序对Android 8.0系统进行适配了。 其实在去年Android 8...

速看,APP测试之ADB最全指南!

大家好,我是coco小锦鲤我又来了 我又带着希望和爱来了 ​今天介绍ADB环境搭建及常用的ADB命令 ADB全称Android Debug Bridge, 是android sdk里的一个工具,目的是起到调试桥的作用,用这个工具可以直接操作管理android模拟器或者真实的andriod设备(手机),是客户端测试常用的辅助工具。 借助adb工具,我们可以管...

用组策略彻底禁止USB存储设备、光驱、软驱、ZIP软驱

转自:http://beyondhdf.blog.51cto.com/229452/131678 一、禁止USB存储设备、光驱、软驱、ZIP软驱 在现在企业网络环境下,由于企业网络越来越大环境越来越复杂。公司内员工素质参差不齐,公司为了加强网络安全性、数据保密性提出要封堵USB存储设备、光驱、软驱、ZIP软驱设备。首先我们在企业网络环境要想实现以上目的,必...

GPG操作——签名验证

问题描述: 可能大家都遇到过软件在下载过程中由于网络原因导致下载的软件体积与实际软件体积不符。最常见的办法是对待下载文件附加一个摘要文件。这种做法比较常见,也比较容易实现。但是,还是会有一个问题:如果我篡改了网站,改变了文件的内容,并对该文件做了一次摘要,替换了原有的摘要文件。那用户下载的文件就失去了摘要验证的意义。如何避免这种问题呢? 解决方案: 软件提...

ios虚拟机安装(二)

1)vmware快照功能 创建还原点:右键-->snapshot(对当前虚拟机系统备份) 2)虚拟机与外界系统通话 找到路径:/vmware/vmware workstation下的darwin 选中菜单项vm-->Rmmovable Devices-->DVD-->setting(connect打上勾)-->选中darwin...