2021-07-19

二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式

这一篇梳理Prism中07示例Module的几种加载方式。

07示例分为了5个,有5种不同的Module加载方式。

我们开始学习加载Modules

观察07-Modules-Appconfig示例

分为ModuleA工程和Modules工程

我们在解决方案上打开管理解决方案的Nuget程序包,ModuleA工程引用了Prism.Wpf;Modules引用了Prism.Unity;

Modules的App.config下配置文件被修改了。我们先不分析,就看一下结构。

<configuration> <configSections> <section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" /> </configSections> <startup> </startup> <modules> <module assemblyFile="ModuleA.dll" moduleType="ModuleA.ModuleAModule, ModuleA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleAModule" startupLoaded="True" /> </modules></configuration>

1、ModuleA工程

ModuleA工程引用了Prism.Wpf。

1.1、新建ModuleAModule.cs

ModuleAModule类继承自IModule,该接口包含2个 方法OnInitialized和RegisterTypes;ModuleAModule中实现OnInitialized方法时使用了IContainerProvider调用了Resolve();

还有印象在第一篇中我们整理的,IRegionManager是一个区域管理,用于绑定区域和视图的,而这里就在做把ViewA使用regionManager的RegisterViewWithRegion()方法,向ContentRegion字符串对应的区域注册ViewA视图。通过上一篇的学习,我们知道这样就能直接把ViewA放在ContentRegion的区域,我们先不管逻辑实现。因为我们看到了配置文件中有这一块的内容,先不看。

 var regionManager = containerProvider.Resolve<IRegionManager>();   regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));

1.2、新建Views下的ViewA自定义控件,在Views的ViewA中只有一个显示控件显示了View A 字号为38。

2、Modules工程

Modules工程引用了Prism.Unity。

2.1App.xaml

添加命名空间

修改Application为prism:PrismApplication

取消StartupUri属性

2.2App.cs

继承类由Application修改为PrismApplication

重写CreateShell()方法,通过Container.Resolve解析MainWindow并返回,作为启动窗体;

重写RegisterTypes方法

重写CreateModuleCatalog(),返回一个ConfigurationModuleCatalog()对象。

 protected override IModuleCatalog CreateModuleCatalog()  {   return new ConfigurationModuleCatalog();  }

2.3Views下的MainWindow.xaml

有一个ContentControl显示控件,设置了附加依赖项属性,区域名称为ContentRegion。MainWindow.cs无特殊修改。

2.4运行代码,界面显示View A

总结:在Modules中做修改了App.config,设置了ConfigSections,我按照命名空间找过去,是使用ConfigurationStore配置Modules的。同时在App.config中也有配置的modules。里面写了assemblyFile、moduleType、moduleName、startupLoaded。也就是说这种方式是使用config配置文件的方式加载Modules,然后再对应的ModuleA或者其他名称的DLL中就可以通过containerProvider,和RegionManager来设置区域和视图的关联,但是客户端软件不推荐这种方法,因为客户端安装再客户电脑上,他可以通过自己修改app.config可以加载不同的模块。这样彻底解耦了DLL和主工程的引用关系。

观察07-Modules-Code示例

同样分为ModuleA和Modules两个工程,Modules工程引用了Prism.Unity;ModuleA工程引用了Prism.Wpf;

1、ModuleA工程

ModuleA工程引用了Prism.Wpf

1.1、新建ModuleAModule.cs

ModuleAModule类继承自IModule接口。并实现了该接口的2个方法,OnInitialized()、RegisterTypes,并再OnInitialized()方法中使用容器代理解析了IRegionManager,然后关联区域和显示界面。用于呈现。

1.2、Views下的ViewA.xaml

只包含了显示控件,显示View A,字号为38;

2、Modules工程

Moudules工程引用了Prism.Unity、ModuleA两个工程;

2.1、App.xaml

添加命名空间:

修改了Application为PrismApplication

去掉了StartupUri属性

2.2App.cs

App修改继承自PrismApplication

重写CreateShell()方法使用Container.Resolve解析MainWindow作为启动窗体;

重写RegisterTypes(不重写编译就报错)

重写ConfigureModuleCatalog方法

 protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)  {   moduleCatalog.AddModule<ModuleA.ModuleAModule>();  }

使用传入的moduleCatalog对象的AddModule方法,传入了ModuleA工程的ModuleAModule类型。

对比了上一篇appconfig篇,我们发现再App.cs中的ConfigureModuleCatalog方法是加载Module的。不同的加载类型,这里都需要重写这个方法。而使用Code加载Module的方法还需要引用工程。

2.3Views下的MainWindow.xaml

设置了ContentControl显示控件,并设置了附加依赖项属性用于设置区域名称为ContentRegion,后台cs中无额外代码

2.4运行Modules工程

界面显示View A。

总结:创建了ModuleA工程、Modules主工程,ModuleA引用了Prism.Wpf;主工程引用了Prism.unity;ModuleA两个工程,主工程通过引用项目的方式引入MouduleA,然后再通过重写PrismApplication的ConfigureModuleCatalog()加载了ModuleA下的ModuleAModule类。ModuleAModule类实现了IModule的OnInitialized()方法,并再该方法关联区域和显示视图,用于显示内容。这种加载方式感觉会比第一种好一些,我们继续往下看下一个例子。

观察07-Modules-Directory示例

分为ModuleA和Modules两个工程,ModuleA工程引用了Prism.Wpf、Modules工程引用了Prism.Unity;

1、ModuleA工程

ModuleA工程引用了Prism.Wpf;

1.1、新建了ModuleAModule.cs类

ModuleAModule继承自Prism.Modularity.IModule,并实现了OnInitialized()、RegisterTypes()

OnInitialized()方法同样使用传入的IContainerProvider容器代理对象Resolve解析出IRegionManager,然后使用这个RegionManager对象去关联一个区域和视图。

1.2、Views下的ViewA.xaml

和其他工程一样,包含一个显示控件显示一个ViewA 字号为38;cs文件中无新增代码。

2、Modules工程

Modules工程引用了Prism.Unity;

2.1、App.xaml

新增命名控件

修改Application为PrismApplication;

去掉StartupUri属性

2.2、App.cs

修改App继承自PrismApplication;

重写CreateShell()使用Container.Resolve()解析MainWindow用作启动窗体;

重写RegisterTypes() 不重写编译失败。

重写CreateModuleCatalog()方法

 protected override IModuleCatalog CreateModuleCatalog()  {   return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };  }

实例化了DirectoryModuleCatalog并传入了路径.\Modules,因为是从目录加载的,这里不知道是不是固定写法,然后所有自己创建的Module只要继承自IModule就行吗?这里没有验证,只是学习知道了可以从目录加载。继续往下。

3.1、Views下的MainWindow.xaml

包含了一个显示控件同时设置了附加依赖项属性区域名称ContentRegion。cs文件无新增代码。

4、先编译ModuleA、然后再运行Modules程序,不然报错;

界面显示View A

总结:使用Directory加载Module的话,再主工程中不需要引用各个Module,只需要配置目录的路径即可,但是没有验证新增ModuleB、C等等,是否可以自动加载进来,这个可以结合第一篇的代码,使用Resolve资源配合创建按钮,再各个Module中Activate和Deactivate修改主工程中区域名称对应的显示内容。

观察07-Modules - LoadManual示例

包含ModuleA和Modules两个工程;ModuleA引用了Prism.Wpf包;Modules引用了Prism.Unity包;

1、ModuleA工程

ModuleA工程只引用了Prism.Wpf;

1.1、新增ModuleAModule.cs

ModuleAModule继承自Prism.Modularity.IModule,并实现了OnInitialized()和RegisterTypes()接口,OnInitialized()方法和前面的项目一样,同样使用IContainerProvider容器代理Resolve解析RegionManager()对象,然后使用regionManager关联区域名称和对应的视图,用于显示。

1.2、Views下的ViewA.xaml

包含用于显示的TextBlock控件。显示内容为View A ,字号为38,cs文件中无修改;

2、Modules工程

Modules工程引用了Prism.Unity;和ModuleA项目;

2.1、App.xaml

增加命名空间prism="http://prismlibrary.com/"

修改Application为PrismApplication

去掉StartupUri属性

2.2App.cs

修改App继承自PrismApplication;

重写CreateShell()方法;

使用Container.Resolve()方法设置启动窗口为MainWindow。

重写RegisterTypes()方法,不重写编译报错。

重写ConfigureModuleCatalog()方法

  protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)  {   var moduleAType = typeof(ModuleAModule);   moduleCatalog.AddModule(new ModuleInfo()   {    ModuleName = moduleAType.Name,    ModuleType = moduleAType.AssemblyQualifiedName,    InitializationMode = InitializationMode.OnDemand   });  }

再添加ModuleA的工程引用后,直接使用typeof读取ModuleAModule。然后再moduleCatalog中使用AddModule方法,新建一个ModuleInfo()对象,包含了,Module的名称、限定名称、加载方式为按需加载;

2.3、Views下的MainWindow.xaml

设置了一个ContentControl 显示控件,并设置了附加依赖项属性用于关联显示区域ContentRegion。

添加了一个Button,注册了Click事件;

2.4、Views下的MainWindow.cs

我们来到CS文件中,我们看到了构造函数中初始化 IModuleManager对象,然后再用户点击Button的时候,使用LoadModule()方法加载ModuleAModule。

3、先编译ModuleA,再运行Modules

我们看到启动后,显示Load Module的Button,点击这个Button后显示View A文字。

总结:再Modules工程中,引入了Prism.Unity和ModuleA,再ModuleA中引用Prism.Wpf。

想使用LoadManual加载的方式,在App.cs中重写ConfiureModuleCatalog()方法时,获取typeof对应的ModuleA工程下的类对象,然后配置对应的程序集信息,在需要的地方,使用_moduleManager下的LoadModule()方法去加载对应的Module,各个Module去实现自己的IModule,用于在OnInitialized()中关联区域和视图。

观察07-Modules - Xaml示例

包含ModuleA工程和Modules工程两个工程,ModuleA引用了Prism.Wpf包、Modules引用了Prism.Unity包和ModuleA项目;

1、ModuleA工程

添加了对Prism.Wpf包的引用;

1.1、创建了ModuleAModule.cs类,继承了Prism.Modularity.IModule接口,实现了OnInitialized()和RegisterTypes()方法,并在OnInitialized()方法中使用传入的IContainerProvider对象调用Resolve发方法解析IRegionManager对象。然后使用IRegionManager的实例来关联字符串为ContentRegion和ViewA视图,用于显示。

1.2、Views下创建了用户自定义控件ViewA.xaml

里面有一个用户显示内容的TextBlock控件,显示内容为View A字号为38,cs文件中无新增内容

2、Modules工程

Modules引用了Prism.Unity包和ModuleA工程;

2.1、App.config

在App.config中添加了configSections节点,里面配置了Prism.Modularity.ModulesConfigurationSection和Modules节点,

用于添加引用Prism下的库,和加载ModuleA.dll的配置项;

2.2、App.xaml

添加了命名空间

修改Application为PrismApplication

去掉StartupUri属性

2.3App.cs

修改App继承自PrismApplication

重写CreateShell()方法,使用Container.Resolve解析MainWindow,并返回做为启动窗体。

重写RegisterTypes()

重写CreateModuleCatalog()

使用XamlModuleCatalog()方法,传入URI。URI文本是当前工程的ModuleCatalog.xaml资源文件作为IModuleCatalog。

2.3ModuleCatalog.xaml

添加命名空间

修改根节点为m:ModuleCatalog,添加子节点m:ModuleInfo.并包含了Mod......

原文转载:http://www.shaoqun.com/a/888694.html

跨境电商:https://www.ikjzd.com/

bsci 认证:https://www.ikjzd.com/w/2339

垂直电商:https://www.ikjzd.com/w/1450

败欧洲运费:https://www.ikjzd.com/w/1555


这一篇梳理Prism中07示例Module的几种加载方式。07示例分为了5个,有5种不同的Module加载方式。我们开始学习加载Modules观察07-Modules-Appconfig示例分为ModuleA工程和Modules工程我们在解决方案上打开管理解决方案的Nuget程序包,ModuleA工程引用了Prism.Wpf;Modules引用了Prism.Unity;Modules的App.co
mein:https://www.ikjzd.com/w/1601
r标:https://www.ikjzd.com/w/1070
世界五大佛教圣地之一,屹立山西百年不变!慕名吸引无数国外游人!:http://www.30bags.com/a/223614.html
世界五大致命温泉 想要命的一定看清楚 :http://www.30bags.com/a/435843.html
世界鲜华之国,欧洲最开放的国家之一荷兰,这些旅游景点值得一去:http://www.30bags.com/a/292546.html
世界现存的5座顶级宫殿,美国俄罗斯均上榜,最牛的居然在中国!:http://www.30bags.com/a/246196.html
被两个学长带到宿舍 学长和我在卫生间里做:http://lady.shaoqun.com/a/247424.html
忘记穿内裤被同桌摸了一天 一群女同学把我玩硬了:http://lady.shaoqun.com/m/a/247351.html
2021深圳儿童戏剧节在哪里看演出:http://www.30bags.com/a/513870.html
男公厕强奸女高中生,被拷打性侵。女孩没有呼救:http://lady.shaoqun.com/a/426294.html
陕西某小学女生被四个男生拖到厕所。嫌疑人不满14岁,没有立案:http://lady.shaoqun.com/a/426295.html
"亲热"之后,女人会想你,会做这三件恶心的事:http://lady.shaoqun.com/a/426296.html

No comments:

Post a Comment