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。
Prism框架的Module(模块化)编程的更多相关文章
- Java9系列第8篇-Module模块化编程
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- 项目中使用Prism框架
Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Prism框架来构建基础的应用框架,并且 ...
- WPF Step By Step 系列-Prism框架在项目中使用
WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...
- Prism框架在项目中使用
本文大纲 1.Prism框架下载和说明 2.Prism项目预览及简单介绍. 3.Prism框架如何在项目中使用. Prism框架下载和说明 Prism框架是针对WPF和Silverlight的MVVM ...
- Prism框架研究(一)
从今天起开始写一个Prism框架的学习博客,今天是第一篇,所以从最基本的一些概念开始学习这个基于MVVM的框架的学习,首先看一下Prism代表什么,这里引用一下比较官方的英文解释来看一下:Prism ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- 【模块化编程】理解requireJS-实现一个简单的模块加载器
在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...
- 【javascript激增的思考01】模块化编程
前言 之前我做过一个web app(原来可以这么叫啦),在一个页面上有很多小窗口,每个小窗口都是独立的应用,比如: ① 我们一个小窗口数据来源是腾讯微博,需要形成腾讯微博app小窗口 ② 我们一个小窗 ...
- require.js实现js模块化编程(一)
1.认识require.js: 官方文档:http://requirejs.org/RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.最新版本的Requ ...
随机推荐
- ARST第三周打卡
Algorithm : 做一个 leetcode 的算法题 //二位数组查找 题目描述 //在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...
- P1373 小a和uim之大逃离(DP)
(点击此处查看原题) 题意 中文题,题意看题面吧. 解题思路 注意到我们只能向右和下移动,由此想到开二维的dp数组dp[i][j],代表当前所在位置 我们需要让两人取数的差值为0,由于起点和走法的不同 ...
- mssql 数据库“查询处理器用尽了内部资源,无法生成查询计划。”问题的处理
在项目中动态拼接sql语句,使用union all连接结果集,每个查询语句都使用了in(几百个数值).语句如: ,,,..............................) UNION ALL ...
- C#.net开发 List与DataTable相互转换
1.DataTable转List集合 /// <summary> /// DataTable转化为List集合 /// </summary> /// <typeparam ...
- O026、Nova组件详解
参考https://www.cnblogs.com/CloudMan6/p/5436855.html 本节开始,我们将详细讲解 Nova 的各个子服务. 前面架构概览一节知道 Nova 有若干 ...
- javascript立体学习指南
javascript立体学习指南第一章:首先了解javascript 首先,什么是javascript? JavaStrip出生于1995年,是一种文本脚本语言,成都装修公司是一种动态的.弱类型的.基 ...
- 【Java】 BIO与NIO以及AIO分析
一.BIO与NIO以及AIO的概念 BIO是同步阻塞式的IO NIO是同步非阻塞的IO (NIO1.0,JDK1.4) AIO是非同步非阻塞的IO(NIO2.0,JDK1.7) 二.BIO简单分析 1 ...
- 5.Hibernate 核心开发接口
一.Configuration(AnnotationConfiguration) 作用:进行配置信息的管理 目标:用来产生SessionFactory 可以在configure 方法中指定hibern ...
- Vue-router 报NavigationDuplicated的可能解决方案
出现这个问题,控制台会报[NavigationDuplicated {_name: "NavigationDuplicated", name: "NavigationDu ...
- 【漏洞分析】Discuz! X系列全版本后台SQL注入漏洞
0x01漏洞描述 Discuz!X全版本存在SQL注入漏洞.漏洞产生的原因是source\admincp\admincp_setting.php在处理$settingnew['uc']['appid' ...