WPF Prsim(一)Region
WPF Prism(二)Module
WPF Prism(三)ViewModelLocator
WPF Prism(四)MVVM
WPF Prism(五)Navigation
WPF Prism(六)Dialog
一、什么是模块(Module)
本质上来说,对于一个应用程序而言,特定功能的所有View、Logic、Service等都可以独立存在。那么我们称每一个独立的功能我们都可以称之为模块。
通常情况下,我们在一个项目当中的结构是这样的:
所有的模块都在一个项目中,这使得应用程序当中,我们难以区分单独的模块,它们似乎变成了一个整体。所以,当我们开始考虑划分模块之间的关系的时候,并且采用新的模块化解决方案,它的结构将变成如下:
该项目包含了一个启动页,并且在启动页当中,我们划分好了对应的区域。这个时候,我们便可以灵活的配置我们的应用程序功能。使用Prism提供的强大功能,我们可以动态的加载应用程序模块,为指定的Region动态分配内容。
二、创建模块
2.1如果安装了VS插件,则可以直接在Module,它是一个类库。创建好之后是这样的:
2.2查看HeaderModule文件
public class HeaderModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
}
HeaderModule类继承自IModule接口,该接口提供了两个方法,分别用于注册和解析对象使用。
2.3实现接口
public class HeaderModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
//View Discovery
var regionManager = containerProvider.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("HeaderRegion", typeof(HeaderView));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
}
}
我们在OnInitialized方法中把View层装载到了Region中。关于视图的装载相关问题可以看这里
2.4在启动项目中添加模块
首先在启动项目添加对HeaderModule项目的引用。然后在App类中重写添加模块函数。
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
base.ConfigureModuleCatalog(moduleCatalog);
moduleCatalog.AddModule<HeaderModule>();
}
上面的示例是直接在App类中重写方法添加模块,但其实还有其他很多办法。
2.4.1配置文件
首先需要修改App.config配置文件,如果项目中没有需要添加一个。(也需要引用Module项目)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf"/>
</configSections>
<modules>
<module assemblyFile="HeaderModule.dll" moduleType="Header.HeaderModule, HeaderModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="HeaderModule" startupLoaded="True" />
</modules>
</configuration>
然后需要重写CreateModuleCatalog()方法:
protected override IModuleCatalog CreateModuleCatalog()
{
return new ConfigurationModuleCatalog();
}
2.4.2Directory
通过读取根目录Modules文件夹查找模块。
protected override IModuleCatalog CreateModuleCatalog()
{
return new DirectoryModuleCatalog() { ModulePath=@".\Modules" };
}
就举例这么多,使用哪一种方式因人而异。