C# Prism框架详解:构建模块化WPF应用程序

[复制链接]
发表于 2025-7-31 14:55:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1. Prism框架简介

Prism是一个用于构建松散耦合、可测试和可维护的WPF桌面应用程序的框架。它最初由微软模式与实践团队开发,如今由社区维护,是构建企业级WPF应用程序的首选框架之一。
Prism框架的焦点上风:


  • 模块化设计:将应用程序分解为独立的功能模块
  • 松散耦合:通过依赖注入和事件聚合器实现组件间的松散耦合
  • MVVM模式支持:提供完整的MVVM(Model-View-ViewModel)实现
  • 导航框架:简化视图间的导航
  • 区域管理:支持动态UI组合
  • 下令模式:提供强大的下令绑定机制
2. Prism焦点组件

2.1 模块化系统

Prism的模块化系统答应开发职员将应用程序分解为独立的功能模块,每个模块可以单独开发、测试和部署。
  1. // 模块定义示例
  2. public class CustomerModule : IModule
  3. {
  4.     private readonly IRegionManager _regionManager;
  5.    
  6.     public CustomerModule(IRegionManager regionManager)
  7.     {
  8.         _regionManager = regionManager;
  9.     }
  10.    
  11.     public void OnInitialized(IContainerProvider containerProvider)
  12.     {
  13.         // 在区域中注册视图
  14.         _regionManager.RegisterViewWithRegion("MainRegion", typeof(CustomerView));
  15.     }
  16.    
  17.     public void RegisterTypes(IContainerRegistry containerRegistry)
  18.     {
  19.         // 注册服务和视图
  20.         containerRegistry.RegisterSingleton<ICustomerService, CustomerService>();
  21.         containerRegistry.RegisterForNavigation<CustomerDetailView>();
  22.     }
  23. }
复制代码
2.2 依赖注入容器

Prism支持多种依赖注入容器,包括Unity、DryIoc和Autofac。依赖注入是实现松散耦合的关键机制。
  1. // 应用程序启动配置
  2. protected override void ConfigureContainer()
  3. {
  4.     // 注册类型到DI容器
  5.     Container.RegisterType<IOrderService, OrderService>(new ContainerControlledLifetimeManager());
  6.     Container.RegisterType<ICustomerRepository, CustomerRepository>();
  7. }
复制代码
2.3 区域管理器

区域管理器答应在预界说的UI区域中动态加载和卸载视图,是实现模块化UI的焦点组件。
  1. // 在XAML中定义区域
  2. <ContentControl prism:RegionManager.RegionName="MainRegion" />
  3. // 在代码中导航到区域
  4. _regionManager.RequestNavigate("MainRegion", "CustomerView");
复制代码
2.4 事件聚合器

事件聚合器提供了一种发布-订阅机制,答应模块之间进行通信而无需直接引用。
  1. // 定义事件
  2. public class CustomerUpdatedEvent : PubSubEvent<CustomerModel> { }
  3. // 发布事件
  4. _eventAggregator.GetEvent<CustomerUpdatedEvent>().Publish(updatedCustomer);
  5. // 订阅事件
  6. _eventAggregator.GetEvent<CustomerUpdatedEvent>()
  7.     .Subscribe(OnCustomerUpdated, ThreadOption.UIThread, false,
  8.     customer => customer.Id == currentCustomerId);
复制代码
3. MVVM模式实现

Prism提供了完整的MVVM实现,包括BindableBase基类、DelegateCommand和导航服务。
3.1 BindableBase

BindableBase类实现了INotifyPropertyChanged接口,简化了属性变动通知。
  1. public class CustomerViewModel : BindableBase
  2. {
  3.     private string _name;
  4.     public string Name
  5.     {
  6.         get => _name;
  7.         set => SetProperty(ref _name, value);
  8.     }
  9.    
  10.     private bool _isActive;
  11.     public bool IsActive
  12.     {
  13.         get => _isActive;
  14.         set => SetProperty(ref _isActive, value,
  15.             () => RaisePropertyChanged(nameof(StatusDisplay)));
  16.     }
  17.    
  18.     public string StatusDisplay => IsActive ? "活跃" : "非活跃";
  19. }
复制代码
3.2 DelegateCommand

DelegateCommand提供了下令模式的实现,支持下令执行条件和下令状态更新。
  1. public class OrderViewModel : BindableBase
  2. {
  3.     private readonly IOrderService _orderService;
  4.     private Order _currentOrder;
  5.    
  6.     public DelegateCommand SubmitOrderCommand { get; private set; }
  7.    
  8.     public OrderViewModel(IOrderService orderService)
  9.     {
  10.         _orderService = orderService;
  11.         SubmitOrderCommand = new DelegateCommand(ExecuteSubmitOrder, CanSubmitOrder)
  12.             .ObservesProperty(() => CurrentOrder.IsValid);
  13.     }
  14.    
  15.     private bool CanSubmitOrder()
  16.     {
  17.         return CurrentOrder != null && CurrentOrder.IsValid;
  18.     }
  19.    
  20.     private void ExecuteSubmitOrder()
  21.     {
  22.         _orderService.SubmitOrder(CurrentOrder);
  23.     }
  24.    
  25.     public Order CurrentOrder
  26.     {
  27.         get => _currentOrder;
  28.         set => SetProperty(ref _currentOrder, value);
  29.     }
  30. }
复制代码
4. 导航框架

Prism的导航框架简化了视图之间的导航,支持导航参数和导航回调。
  1. // 注册导航
  2. containerRegistry.RegisterForNavigation<ProductDetailView>("ProductDetail");
  3. // 执行导航
  4. _navigationService.NavigateAsync("ProductDetail?id=123",
  5.     new NavigationParameters
  6.     {
  7.         { "category", "electronics" }
  8.     });
  9. // 在目标ViewModel中接收参数
  10. public override void OnNavigatedTo(INavigationParameters parameters)
  11. {
  12.     if (parameters.ContainsKey("id"))
  13.     {
  14.         string productId = parameters.GetValue<string>("id");
  15.         LoadProduct(productId);
  16.     }
  17. }
复制代码
5. 对话框服务

Prism提供了对话框服务,用于表现模态和非模态对话框。
  1. // 注册对话框
  2. containerRegistry.RegisterDialog<ConfirmationDialog, ConfirmationDialogViewModel>();
  3. // 显示对话框
  4. _dialogService.ShowDialog("ConfirmationDialog",
  5.     new DialogParameters
  6.     {
  7.         { "title", "确认删除" },
  8.         { "message", "确定要删除此项目吗?" }
  9.     },
  10.     r =>
  11.     {
  12.         if (r.Result == ButtonResult.OK)
  13.         {
  14.             DeleteItem();
  15.         }
  16.     });
复制代码
6. 实际应用示例

下面是一个简单的Prism应用程序结构示例:
  1. MyPrismApp/
  2. ├── MyPrismApp.Core/            # 核心库,包含共享接口和模型
  3. ├── MyPrismApp.Modules.Orders/  # 订单模块
  4. ├── MyPrismApp.Modules.Customers/ # 客户模块
  5. ├── MyPrismApp.Modules.Products/  # 产品模块
  6. └── MyPrismApp/                 # 主应用程序
  7.     ├── App.xaml
  8.     ├── App.xaml.cs
  9.     └── Shell.xaml              # 主窗口
复制代码
6.1 应用程序启动类

  1. public partial class App : PrismApplication
  2. {
  3.     protected override Window CreateShell()
  4.     {
  5.         return Container.Resolve<Shell>();
  6.     }
  7.     protected override void RegisterTypes(IContainerRegistry containerRegistry)
  8.     {
  9.         containerRegistry.RegisterSingleton<IApplicationSettingsService, ApplicationSettingsService>();
  10.         containerRegistry.RegisterSingleton<IThemeService, ThemeService>();
  11.     }
  12.     protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
  13.     {
  14.         // 注册模块
  15.         moduleCatalog.AddModule<CustomersModule>();
  16.         moduleCatalog.AddModule<OrdersModule>();
  17.         moduleCatalog.AddModule<ProductsModule>();
  18.     }
  19. }
复制代码
6.2 Shell视图

  1. <Window x:Class="MyPrismApp.Views.Shell"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:prism="http://prismlibrary.com/"
  5.         Title="Prism应用示例" Height="600" Width="800">
  6.     <Grid>
  7.         <Grid.RowDefinitions>
  8.             <RowDefinition Height="Auto"/>
  9.             <RowDefinition Height="*"/>
  10.             <RowDefinition Height="Auto"/>
  11.         </Grid.RowDefinitions>
  12.         
  13.         <!-- 顶部菜单 -->
  14.         <Menu Grid.Row="0">
  15.             <MenuItem Header="文件">
  16.                 <MenuItem Header="退出" Command="{Binding ExitCommand}"/>
  17.             </MenuItem>
  18.             <MenuItem Header="客户" Command="{Binding NavigateCommand}"
  19.                       CommandParameter="Customers"/>
  20.             <MenuItem Header="订单" Command="{Binding NavigateCommand}"
  21.                       CommandParameter="Orders"/>
  22.             <MenuItem Header="产品" Command="{Binding NavigateCommand}"
  23.                       CommandParameter="Products"/>
  24.         </Menu>
  25.         
  26.         <!-- 主内容区域 -->
  27.         <ContentControl Grid.Row="1" prism:RegionManager.RegionName="MainRegion" />
  28.         
  29.         <!-- 状态栏 -->
  30.         <StatusBar Grid.Row="2">
  31.             <TextBlock Text="{Binding StatusMessage}" />
  32.         </StatusBar>
  33.     </Grid>
  34. </Window>
复制代码
7. 最佳实践

7.1 模块设计原则



  • 每个模块应该是自包罗的,拥有自己的视图、视图模子和服务
  • 模块之间通过接口和事件聚合器通信,避免直接引用
  • 共享功能应放在焦点模块中
7.2 性能优化



  • 利用按需加载模块,镌汰启动时间
  • 合理利用CompositeCommand,避免过多的下令绑定
  • 优化区域管理器的视图切换
  1. // 配置按需加载模块
  2. protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
  3. {
  4.     // 启动时加载
  5.     moduleCatalog.AddModule<CoreModule>();
  6.    
  7.     // 按需加载
  8.     moduleCatalog.AddModule(typeof(ReportsModule).Name,
  9.         typeof(ReportsModule).AssemblyQualifiedName,
  10.         InitializationMode.OnDemand);
  11. }
复制代码
7.3 测试策略

Prism的松散耦合设计使得单元测试变得简单:
  1. [TestMethod]
  2. public void CanExecuteSubmitOrder_WithValidOrder_ReturnsTrue()
  3. {
  4.     // Arrange
  5.     var orderServiceMock = new Mock<IOrderService>();
  6.     var viewModel = new OrderViewModel(orderServiceMock.Object);
  7.     var order = new Order { IsValid = true };
  8.     viewModel.CurrentOrder = order;
  9.    
  10.     // Act
  11.     bool canExecute = viewModel.SubmitOrderCommand.CanExecute();
  12.    
  13.     // Assert
  14.     Assert.IsTrue(canExecute);
  15. }
复制代码
8. 与其他框架的比较

特性PrismMVVM LightCaliburn.Micro模块化✓✗部门支持依赖注入✓部门支持✓区域管理✓✗✗事件聚合器✓✓✓导航框架✓部门支持✓对话框服务✓✗✓学习曲线中等低高社区支持活跃一样寻常一样寻常9. 总结

Prism框架是构建企业级WPF应用程序的强大工具,它提供了模块化、松散耦合和MVVM支持等关键特性。通过利用Prism,开发职员可以创建可维护、可测试和可扩展的应用程序。
固然Prism有一定的学习曲线,但其提供的功能和架构上风使其成为大型WPF应用程序开发的抱负选择。对于需要构建复杂、模块化桌面应用的团队来说,投资学习Prism将带来恒久的收益。
10. 参考资源



  • Prism官方文档
  • Prism GitHub堆栈
  • Prism参考应用
  • Brian Lagunas的Prism视频教程

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表