Prism Step6 Modules

Prism Step6 Modules

Modules 是能够独立开发、测试、部署的功能单元,Modules 可以被设计成实现特定业务逻辑的模块(如 Profile Management),也可以被设计成实现通用基础设施或服务的模块(如 Logging、Exception Management)。

既然 Modules 能够独立开发、测试、部署,那么如何告诉 Shell(我们的宿主程序)去 Load 哪些 Module,以怎样的形式 Load 这些 Module 呢?Prism 为此提供了一个叫 ModuleCatalog 的东西。他用这个来管理 Module。所以在 App 启动之初,需要创建配置一个 ModuleCatalog。

7.1 Prism 中更新了两个方法:

1
2
3
4
5
6
7
// Summary:
// Notifies the module that it has be initialized.
void OnInitialized(IContainerProvider containerProvider);
//
// Summary:
// Used to register types with the container that will be used by your application.
void RegisterTypes(IContainerRegistry containerRegistry);

先新增一个 WpfApp 项目,命名 ModuleA,删除 App.config 和 App.xaml,然后将 outputType 改为 Class Library。

在 Views 文件夹下面新建一个用户控件 ViewA

新增一个类 ModuleAModule.cs 实现 IModule 接口(每一个 Module 类都要实现这个接口,而每一个 Module 都要有这样一个类来对 Module 里的资源统一管理)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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));
}

public void RegisterTypes(IContainerRegistry containerRegistry)
{

}
}
}

OnInitialized 实现的时候,顺便将一个 viewA 与 ContentRegion 进行关联,看代码

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

App.xaml.cs 中重写 ConfigureModuleCatalog

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

App.xaml.cs 中重写 CreateModuleCatalog

1
2
3
4
protected override IModuleCatalog CreateModuleCatalog()
{
return new ConfigurationModuleCatalog();
}

这表示,ModuleCatalog 将从配置文件中创建。

App.config 中添加了节点,并且指定了需要 Load 的 module,并且设置了 startupLoaded 参数来告诉 shell,是否在启动时就加载他。下面是 App.config 的内容,他加载了一个名为 ModuleAModule 的 Module,存在 ModuleA.dll。

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<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>

Directory

ModulePath 就是你需要加载的 module 的 dll 生成目录

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

LoadManual

重写 ConfigureModuleCatalog 方法:

1
2
3
4
5
6
7
8
9
10
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
var moduleAType = typeof(ModuleAModule);
moduleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleAType.Name,
ModuleType = moduleAType.AssemblyQualifiedName,
InitializationMode = InitializationMode.OnDemand
});
}

评论