目录

.NET_Prism基本项目创建

.NET_Prism基本项目创建

Prism简述

  1. 模块(Module) :独立的功能单元,可动态加载。
  2. 依赖注入(Dependency Injection,DI) :通过 IoC 容器(如 Unity、Autofac)管理模块之间的依赖关系。(一个类型是具体的(非抽象的)并且有一个公共构造函数,容器在需要的时候就会自动创建它的实例,即使你没有显式地在容器中注册该类型)
  3. 区域管理(Region Management) :使用 IRegionManager 进行动态 UI 组件加载。
  4. 事件聚合(Event Aggregator) :使用 IEventAggregator 进行模块间通信。

Prism 项目创建(MVVM)

1 安装Prism

Install-Package Prism.Unity 关于Prism.Core与Prism.Unity的关系

  • Prism.Core 是 Prism 的基础库,提供核心功能(事件聚合、命令、MVVM 基础功能等 ),适用于所有平台(如 WPF、Xamarin)。
  • Prism.Unity 依赖于 Prism.Core,并为 Prism 提供 Unity 依赖注入支持,模块化开发、区域管理 ,适用于 WPF 应用。

2 创建启动类

2.1 修改App.xaml ① 添加命名空间xmlns:prism=“ ② 将标签名修改为prism:PrismApplication ③ 删除StartUri 示例代码

2.2 修改App.xaml.cs ① 实现PrismApplication类 ② 重写CreateShell()ConfigureModuleCatalog(IModuleCatalog moduleCatalog ③ (可选)重写RegisterTypes(IContainerRegistry containerRegistry) 注:App.xaml.cs中所做的设置均为全局设置 注:App.xaml.cs实例由WPF框架创建,无法通过构造函数依赖注入。若想获取IRegionManager可通过 var regionManager = Container.Resolve() 获取,IEventAggregator同理 示例代码 public partial class App : PrismApplication { /**

  • 此处设置均为全局设置 / /*
  • 解析并返回主窗口 / protected override Window CreateShell() { return Container.Resolve(); } /*
  • 注册服务: 依赖注入或导航
  • 例如: containerRegistry.Register();
  • 例如: containerRegistry.RegisterSingleton();
  • 例如: containerRegistry.RegisterForNavigation();
  • IRegionManager与IEventAggregator已由Prism注册 / protected override void RegisterTypes(IContainerRegistry containerRegistry) { } /*
  • 模块注册
  • (
  • 按需加载
  • moduleCatalog.AddModule(InitializationMode.OnDemand);
  • (在其他地方)
  • private readonly IModuleManager _moduleManager;
  • public MyClass(IModuleManager moduleManager)
  • {
  • _moduleManager = moduleManager;
  • }
  • ……
  • _moduleManager.LoadModule(“ModuleA”);
  • ) */ protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { moduleCatalog.AddModule(); moduleCatalog.AddModule(); } }

3 创建主窗口

① 添加命名空间 xmlns:prism=“ ② 添加区域(Region) 以动态加载View (例如:) 注:主窗口至少需要一个区域 示例代码

4 创建模块

① 实现IModule接口 ② 实现OnInitialized(IContainerProvider containerProvider)与RegisterTypes(IContainerRegistry containerRegistry) 注:模块中所做的设置仅在模块被加载时才生效 示例代码 public class ModuleA : IModule { /**

  • 模块中的一切设置均局限于本模块内 仅在模块被加载时生效 / private readonly IRegionManager _regionManager; public ModuleA(IRegionManager regionManager) { _regionManager = regionManager; } /*
  • 模块初始化逻辑 / public void OnInitialized(IContainerProvider containerProvider) { // 将 ViewA 区域注入至 MainRegion(或者说将 MainRegion 的初始视图设置为 ViewA) _regionManager.RegisterViewWithRegion(“MainRegion”, typeof(ViewA)); } /*
  • 注册服务: 依赖注入或导航 */ public void RegisterTypes(IContainerRegistry containerRegistry) { // 注册导航服务 containerRegistry.RegisterForNavigation(); containerRegistry.RegisterForNavigation(); } }

5 创建View与ViewModel

说明: ① View与ViewModel的自动绑定规则: View位于Views文件夹下,ViewModel位于ViewModels文件夹下 Views文件夹与ViewModels文件夹位于同一命名空间 ViewModel的命名为xxxViewModel(xxx为View的命名) ② BindableBase类:类继承BindableBase类后,通过SetProperty(ref _param, value)可自动处理 INotifyPropertyChange 注:propp可快捷创建使用SetProperty(ref _param, value)的属性 View示例代码

ViewModel示例代码 public class ViewAViewModel : BindableBase { private readonly IRegionManager _regionManager; private readonly IEventAggregator _eventAggregator; public ViewAViewModel(IRegionManager regionManager, IEventAggregator eventAggregator) { _regionManager = regionManager; _eventAggregator = eventAggregator; _eventAggregator.GetEvent().Subscribe(ReceiveMessage); } public ICommand AlertCommand { get => new DelegateCommand(Alert); } public ICommand ChangeCommand { get => new DelegateCommand(Change); } private string _message = “None”; public string Message { get => _message; set => SetProperty(ref _message, value); } private void Alert() { new Window().Show(); } private void Change() { // 将MainRegion区域导航至ViewB _regionManager.RequestNavigate(“MainRegion”, “ViewB”); } private void ReceiveMessage(string message) { Message = message; } }

至此基本的Prism项目就创建完成