首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

WPF框架介绍---Prism框架(万字长文一篇文章带你弄懂Prism)

  • 25-04-25 05:21
  • 3824
  • 6843
blog.csdn.net

目录

Prism中的基本对象

数据与行为对象

1. BindableBase:数据绑定的基础

作用与特性

关键方法

使用示例

2. DelegateCommand/DelegateCommand :行为的封装

作用与特性

关键方法

使用示例

无参数命令

带参数的命令

在 XAML 中绑定命令

Prism框架中的IoC(控制反转)容器

1. 核心接口与配置

1.1 容器配置入口

1.2 关键接口

2. 服务注册方式

2.1 基础注册

2.2 生命周期控制

3. 依赖注入方式

3.1 构造函数注入(推荐)

3.2 属性注入(需谨慎)

4. 模块化中的IoC

5. 解析服务

6. 高级功能

6.1 命名注册

6.2 延迟加载与工厂模式

Prism框架中的消息对象(事件总线)

1. 核心组件

2. 使用流程

2.1 定义事件类

2.2 发布事件

2.3 订阅事件

3. 高级配置

3.1 订阅选项

各参数的应用场景总结

详细使用教程

1. 主要委托方法(回调逻辑)

2. 消息过滤条件(filter)

3. 消息委托的引用方式(keepSubscriberReferenceAlive)

4. 多线程状态控制(ThreadOption)

3.2 取消订阅

4. 实际应用场景

4.1 跨模块通信

4.2 全局状态通知

4.3 弹窗交互

Prism框架中的弹窗对象

1. 核心组件

1.1 IDialogService

1.2 IDialogAware

2. 创建弹窗的完整流程

2.1 定义弹窗视图(View)

2.2 实现弹窗ViewModel

2.3 注册弹窗

3. 触发弹窗显示

3.1 在ViewModel中调用弹窗

3.2 直接通过View触发(不推荐,破坏MVVM)

4. 高级功能

4.1 自定义弹窗样式

4.2 异步弹窗交互

4.3 弹窗传参与复杂数据

Prism框架中的区域化管理(Region Management)

1. 核心概念

2. 区域的定义与注册

2.1 在XAML中标记区域

2.2 通过代码动态注册区域

3. 视图注入与导航

3.1 向区域注入视图

3.2 视图导航生命周期

4. 区域适配器(支持复杂控件)

5. 区域上下文(共享数据)

Prism框架中的模块化设计

1. 模块的核心组成

2. 模块的创建与配置

2.1 定义模块

2.2 模块目录配置

3. 模块加载策略

4. 模块间的通信与解耦


Prism中的基本对象

数据与行为对象

1. BindableBase:数据绑定的基础

BindableBase 是 Prism 中实现 数据绑定通知 的核心基类,继承自 INotifyPropertyChanged 接口。它简化了属性变更通知的触发逻辑,确保 UI 能够自动响应数据变化。

作用与特性
  • 自动触发通知:通过 SetProperty 方法设置属性值,自动触发 PropertyChanged 事件。
  • 减少样板代码:避免手动编写 if (value != field) { ... } 和事件触发逻辑。
  • 支持派生类:ViewModel 通常继承 BindableBase,直接使用其功能。
关键方法
  • SetProperty(ref T field, T value):基础属性设置。
  • SetProperty(ref T field, T value, Action onChanged):设置属性并执行回调。
  • RaisePropertyChanged(string propertyName):手动触发指定属性的通知。
使用示例
  1. public class UserViewModel : BindableBase
  2. {
  3. private string _name;
  4. public string Name
  5. {
  6. get => _name;
  7. set => SetProperty(ref _name, value); // 自动触发PropertyChanged事件
  8. }
  9. private int _age;
  10. public int Age
  11. {
  12. get => _age;
  13. set => SetProperty(ref _age, value, () =>
  14. {
  15. // 可选:属性变更后的回调逻辑(如验证)
  16. });
  17. }
  18. }

2. DelegateCommand/DelegateCommand:行为的封装

DelegateCommand 是 Prism 对 ICommand 接口的实现,用于将 UI 操作(如按钮点击) 绑定到 ViewModel 中的方法,支持条件执行(CanExecute)。

作用与特性
  • 解耦 UI 与逻辑:将点击事件转化为命令,直接在 ViewModel 中处理。
  • 支持条件执行:通过 CanExecute 控制命令是否可用(如按钮禁用状态)。
  • 泛型与非泛型:DelegateCommand 无参数,DelegateCommand 支持参数传递。
关键方法
  • Execute():命令执行时调用的方法。
  • CanExecute():返回 bool,决定命令是否可用。
  • RaiseCanExecuteChanged():手动触发 CanExecute 的重新检查。
使用示例
无参数命令
  1. public class UserViewModel : BindableBase
  2. {
  3. // 定义命令
  4. public DelegateCommand SaveCommand { get; }
  5. public UserViewModel()
  6. {
  7. // 绑定执行方法与条件检查
  8. SaveCommand = new DelegateCommand(ExecuteSave, CanSave);
  9. }
  10. private void ExecuteSave()
  11. {
  12. // 保存逻辑
  13. }
  14. private bool CanSave()
  15. {
  16. // 检查保存条件(如数据有效性)
  17. return !string.IsNullOrEmpty(Name);
  18. }
  19. // 当Name属性变化时,手动触发CanExecute检查
  20. public string Name
  21. {
  22. get => _name;
  23. set
  24. {
  25. SetProperty(ref _name, value);
  26. SaveCommand.RaiseCanExecuteChanged(); // 通知命令重新检查条件
  27. }
  28. }
  29. }
带参数的命令
  1. public DelegateCommand<int> DeleteCommand { get; }
  2. public UserViewModel()
  3. {
  4. DeleteCommand = new DelegateCommand<int>(ExecuteDelete, CanDelete);
  5. }
  6. private void ExecuteDelete(int userId)
  7. {
  8. // 删除指定用户
  9. }
  10. private bool CanDelete(int userId)
  11. {
  12. return userId > 0; // 仅当userId有效时允许执行
  13. }
在 XAML 中绑定命令
  1. <Button Command="{Binding SaveCommand}" Content="Save" />
  2. <Button Command="{Binding DeleteCommand}" CommandParameter="{Binding SelectedUser.Id}" Content="Delete" />

Prism框架中的IoC(控制反转)容器

在Prism框架中,IoC容器是实现依赖注入(DI)的核心机制,用于管理组件生命周期、解耦服务依赖并支持模块化开发。Prism默认支持多种容器(如 Unity、DryIoc)。

1. 核心接口与配置

1.1 容器配置入口

Prism应用的入口类(继承自PrismApplication)负责初始化容器:

  1. public partial class App : PrismApplication
  2. {
  3. protected override void RegisterTypes(IContainerRegistry containerRegistry)
  4. {
  5. // 注册全局服务
  6. containerRegistry.RegisterSingleton();
  7. containerRegistry.Register();
  8. }
  9. protected override Window CreateShell()
  10. {
  11. return Container.Resolve();
  12. }
  13. }

1.2 关键接口

  • IContainerRegistry:用于注册服务(接口与实现的映射)。
  • IContainerProvider:用于解析(获取)已注册的服务实例。

2. 服务注册方式

2.1 基础注册

接口绑定实现类:

containerRegistry.Register();

直接注册具体类(无需接口):

containerRegistry.Register();

2.2 生命周期控制

单例(Singleton):全局唯一实例。

containerRegistry.RegisterSingleton();

瞬态(Transient):每次解析创建新实例。

containerRegistry.Register();

实例注册:直接注入已有实例。

  1. var logger = new FileLogger();
  2. containerRegistry.RegisterInstance(logger);

3. 依赖注入方式

3.1 构造函数注入(推荐)

ViewModel或服务通过构造函数声明依赖,容器自动注入:

  1. public class UserViewModel
  2. {
  3. private readonly IDataService _dataService;
  4. public UserViewModel(IDataService dataService)
  5. {
  6. _dataService = dataService; // 由容器自动注入
  7. }
  8. }

3.2 属性注入(需谨慎)

通过 [Dependency] 特性标记需注入的属性:

  1. public class OrderService
  2. {
  3. [Dependency]
  4. public ILogger Logger { get; set; }
  5. }

4. 模块化中的IoC

每个Prism模块(实现 IModule 接口)可独立注册服务:

  1. public class DataModule : IModule
  2. {
  3. public void RegisterTypes(IContainerRegistry containerRegistry)
  4. {
  5. containerRegistry.Register();
  6. }
  7. public void OnInitialized(IContainerProvider containerProvider)
  8. {
  9. // 模块初始化逻辑(如预加载数据)
  10. }
  11. }

5. 解析服务

通过 IContainerProvider 或构造函数隐式解析服务:

  1. // 在ViewModel中解析服务
  2. public class MainViewModel
  3. {
  4. public MainViewModel(IContainerProvider containerProvider)
  5. {
  6. var service = containerProvider.Resolve();
  7. }
  8. }

6. 高级功能

6.1 命名注册

同一接口多个实现时,使用名称区分:

  1. containerRegistry.Register("Email");
  2. containerRegistry.Register("SMS");
  3. // 解析指定名称的实现
  4. var emailService = container.Resolve("Email");

6.2 延迟加载与工厂模式

通过 Func 或 IocContainer.CreateScope 实现复杂依赖管理:

containerRegistry.Register(() => new ServiceFactory());

Prism框架中的消息对象(事件总线)

在Prism框架中,事件总线(Event Aggregator) 是实现松耦合跨组件通信的核心机制。它通过发布-订阅模式(Pub-Sub)让不同模块、视图或服务之间无需直接引用即可传递消息,尤其适用于模块化架构和MVVM模式。

1. 核心组件

  • IEventAggregator:
    事件聚合器的入口接口,负责创建和管理事件对象。
    通过依赖注入获取实例:
  1. public class MyViewModel
  2. {
  3. private readonly IEventAggregator _eventAggregator;
  4. public MyViewModel(IEventAggregator eventAggregator)
  5. {
  6. _eventAggregator = eventAggregator;
  7. }
  8. }
  • PubSubEvent:
    所有自定义事件的基类,泛型 T 定义事件传递的数据类型。
    开发者需继承此类创建特定事件:
public class UserLoggedInEvent : PubSubEvent<UserInfo> { }

2. 使用流程

2.1 定义事件类

创建继承自 PubSubEvent 的事件类,定义事件的数据类型:

  1. // 无参数事件
  2. public class AppShutdownEvent : PubSubEvent { }
  3. // 带参数事件
  4. public class OrderSubmittedEvent : PubSubEvent<Order> { }

2.2 发布事件

通过 GetEvent() 获取事件实例并发布数据:

  1. // 发布无参数事件
  2. _eventAggregator.GetEvent().Publish();
  3. // 发布带参数事件
  4. var order = new Order { Id = 123, Amount = 100.0 };
  5. _eventAggregator.GetEvent().Publish(order);

2.3 订阅事件

  1. // 订阅事件(自动强引用,需手动取消订阅)
  2. _eventAggregator.GetEvent()
  3. .Subscribe(OnOrderSubmitted);
  4. // 处理事件的回调方法
  5. private void OnOrderSubmitted(Order order)
  6. {
  7. // 处理订单提交逻辑
  8. MessageBox.Show($"订单 {order.Id} 已提交!");
  9. }

3. 高级配置

3.1 订阅选项

通过 Subscribe 方法的参数配置订阅行为:

  1. _eventAggregator.GetEvent()
  2. .Subscribe(
  3. onOrderSubmitted, // 回调方法
  4. ThreadOption.UIThread, // 在UI线程执行
  5. keepSubscriberReferenceAlive: false, // 弱引用
  6. filter: order => order.UserId == _currentUserId // 仅处理当前用户的订单
  7. );
各参数的应用场景总结

参数

典型场景

回调方法

执行具体的业务逻辑(如更新数据库、刷新UI)。

filter

过滤无关事件(如只处理特定用户或状态的数据)。

keepSubscriberReferenceAlive

控制订阅者生命周期(View/ViewModel用弱引用,服务层可强引用)。

ThreadOption

解决跨线程问题(UI操作必须在UI线程,耗时操作在后台线程)。

详细使用教程
1. 主要委托方法(回调逻辑)
  • 作用:定义事件触发时执行的核心逻辑。
  • 语法:通过 Action 或带参数的委托实现。
  • 示例:
  1. _eventAggregator.GetEvent()
  2. .Subscribe(OnOrderSubmitted); // OnOrderSubmitted为回调方法
  3. private void OnOrderSubmitted(Order order)
  4. {
  5. // 处理订单提交逻辑
  6. _logger.Log($"订单 {order.Id} 已处理");
  7. }
2. 消息过滤条件(filter)
  • 作用:根据条件过滤事件,仅当数据满足条件时触发回调。
  • 类型:Predicate(返回 bool 的表达式)。
  • 示例:
  1. .Subscribe(OnHighValueOrder,
  2. filter: order => order.Amount > 1000 // 仅处理金额超过1000的订单
  3. );
  • 场景:
    • 仅处理特定类型的数据(如高优先级任务)。
    • 避免不必要的事件响应(如仅关注当前用户的订单)。
3. 消息委托的引用方式(keepSubscriberReferenceAlive)
  • 作用:控制订阅者的生命周期引用方式,防止内存泄漏。
  • 可选值:
    • true:强引用,订阅者不会被垃圾回收,需手动取消订阅。
    • false(默认):弱引用,订阅者销毁后自动取消订阅。
  • 示例:
  1. // 使用弱引用(推荐)
  2. .Subscribe(OnOrderSubmitted,
  3. keepSubscriberReferenceAlive: false
  4. );
  5. // 使用强引用(需手动管理)
  6. .Subscribe(OnOrderSubmitted,
  7. keepSubscriberReferenceAlive: true
  8. );
  • 最佳实践:
    • ViewModel/View 订阅事件时,默认使用弱引用(避免因未取消订阅导致内存泄漏)。
    • 全局服务 或长期存在的对象可使用强引用,但需在不再需要时调用 Unsubscribe。
4. 多线程状态控制(ThreadOption)
  • 作用:指定回调方法在哪个线程执行,解决跨线程访问UI的问题。
  • 可选值:
    • PublisherThread:在发布事件的线程执行(默认)。
    • UIThread:在UI线程执行(安全更新界面)。
    • BackgroundThread:在线程池后台线程执行(避免阻塞UI)。
  • 示例:
  1. // 在UI线程更新界面
  2. .Subscribe(UpdateUI,
  3. ThreadOption.UIThread
  4. );
  5. // 在后台线程处理耗时操作
  6. .Subscribe(ProcessData,
  7. ThreadOption.BackgroundThread
  8. );
  • 线程安全场景:
    • UI操作:必须使用 UIThread,否则会抛出跨线程异常。
    • 数据计算/IO操作:使用 BackgroundThread 避免阻塞主线程。
    • 同步上下文:若发布者本身在UI线程,PublisherThread 等同于 UIThread。

3.2 取消订阅

  • 手动取消:
    保存订阅令牌(SubscriptionToken),调用 Unsubscribe 方法。
  1. private SubscriptionToken _token;
  2. _token = _eventAggregator.GetEvent()
  3. .Subscribe(OnOrderSubmitted);
  4. // 取消订阅
  5. _eventAggregator.GetEvent().Unsubscribe(_token);
  • 自动取消:
    使用弱引用(keepSubscriberReferenceAlive: false),订阅者销毁时自动取消订阅。

4. 实际应用场景

4.1 跨模块通信

  • 场景:订单模块提交订单后,通知购物车模块清空购物车。
  • 实现:
  1. // 订单模块发布事件
  2. _eventAggregator.GetEvent().Publish(order);
  3. // 购物车模块订阅事件
  4. _eventAggregator.GetEvent()
  5. .Subscribe(_ => ClearCart());

4.2 全局状态通知

  • 场景:用户登录后,通知所有模块更新界面。
  • 实现:
  1. // 登录成功后发布事件
  2. _eventAggregator.GetEvent().Publish(userInfo);
  3. // 各模块订阅事件
  4. _eventAggregator.GetEvent()
  5. .Subscribe(UpdateUI);

4.3 弹窗交互

  • 场景:在ViewModel中触发弹窗,无需直接操作View。
  • 实现:
  1. // 定义弹窗事件
  2. public class ShowDialogEvent : PubSubEvent<DialogParameters> { }
  3. // 发布弹窗请求
  4. var parameters = new DialogParameters { { "message", "保存成功!" } };
  5. _eventAggregator.GetEvent().Publish(parameters);
  6. // 弹窗服务订阅事件并显示弹窗
  7. _eventAggregator.GetEvent()
  8. .Subscribe(ShowDialog, ThreadOption.UIThread);
  9. private void ShowDialog(DialogParameters parameters)
  10. {
  11. _dialogService.ShowDialog("MessageDialog", parameters);
  12. }

Prism框架中的弹窗对象

1. 核心组件

1.1 IDialogService

  • 作用:管理弹窗的显示、关闭及结果回调。
  • 关键方法:
  1. // 显示弹窗
  2. void ShowDialog(string name, IDialogParameters parameters, Action callback);
  3. // 显示模态弹窗(阻塞式)
  4. void Show(string name, IDialogParameters parameters, Action callback);

1.2 IDialogAware

  • 作用:弹窗ViewModel必须实现的接口,定义弹窗的生命周期方法。
  • 核心成员:
  1. bool CanCloseDialog(); // 控制弹窗是否允许关闭
  2. void OnDialogOpened(IDialogParameters parameters); // 弹窗打开时接收参数
  3. string Title { get; } // 弹窗标题

2. 创建弹窗的完整流程

2.1 定义弹窗视图(View)

  • XAML示例(WarningDialog.xaml):
  1. xmlns:prism="http://prismlibrary.com/"
  2. prism:ViewModelLocator.AutoWireViewModel="True">
  3. "{Binding Message}" Margin="10"/>

2.2 实现弹窗ViewModel

  • 继承 IDialogAware 并处理逻辑:
  1. public class WarningDialogViewModel : BindableBase, IDialogAware
  2. {
  3. // 实现IDialogAware
  4. public string Title => "警告";// 弹出窗口的标题
  5. public event Action RequestClose;// 执行关闭返回
  6. private string _message;
  7. public string Message
  8. {
  9. get => _message;
  10. set => SetProperty(ref _message, value);
  11. }
  12. // 命令定义
  13. public DelegateCommand ConfirmCommand { get; }
  14. public DelegateCommand CancelCommand { get; }
  15. public WarningDialogViewModel()
  16. {
  17. ConfirmCommand = new DelegateCommand(() =>RequestClose?.Invoke(new DialogResult(ButtonResult.OK)));
  18. CancelCommand = new DelegateCommand(() =>RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)));
  19. }
  20. // 当弹出窗口关闭时执行的逻辑
  21. public void OnDialogClosed()
  22. {
  23. }
  24. // 当弹出窗口打开的时候执行的逻辑
  25. public void OnDialogOpened(IDialogParameters parameters)
  26. {
  27. // 接收参数
  28. Message = parameters.GetValue<string>("message");
  29. }
  30. public bool CanCloseDialog() => true; // 允许直接关闭
  31. }

2.3 注册弹窗

  • 在App或模块中注册:
  1. protected override void RegisterTypes(IContainerRegistry containerRegistry)
  2. {
  3. containerRegistry.RegisterDialog("WarningDialog");
  4. }

3. 触发弹窗显示

3.1 在ViewModel中调用弹窗

  1. public class MainViewModel
  2. {
  3. private readonly IDialogService _dialogService;
  4. public MainViewModel(IDialogService dialogService)
  5. {
  6. _dialogService = dialogService;
  7. }
  8. public DelegateCommand ShowDialogCommand => new DelegateCommand(() =>
  9. {
  10. var parameters = new DialogParameters
  11. {
  12. { "message", "确定要删除此文件吗?" }
  13. };
  14. _dialogService.ShowDialog("WarningDialog", parameters, result =>
  15. {
  16. if (result.Result == ButtonResult.OK)
  17. {
  18. // 用户点击确认后的逻辑
  19. DeleteFile();
  20. }
  21. });
  22. });
  23. }

3.2 直接通过View触发(不推荐,破坏MVVM)

4. 高级功能

4.1 自定义弹窗样式

  • 覆盖默认样式:
    在App.xaml中定义全局弹窗样式:

4.2 异步弹窗交互

  • 使用Task封装弹窗结果:
  1. public async Task<bool> ShowConfirmationAsync(string message)
  2. {
  3. var tcs = new TaskCompletionSource<bool>();
  4. var parameters = new DialogParameters { { "message", message } };
  5. _dialogService.ShowDialog("ConfirmationDialog", parameters, result =>
  6. {
  7. tcs.SetResult(result.Result == ButtonResult.OK);
  8. });
  9. return await tcs.Task;
  10. }

4.3 弹窗传参与复杂数据

  • 传递对象参数:
  1. var order = new Order { Id = 123, Amount = 100.0 };
  2. parameters.Add("order", order);
  • 接收并处理对象:
  1. public void OnDialogOpened(IDialogParameters parameters)
  2. {
  3. var order = parameters.GetValue("order");
  4. // 使用order数据...
  5. }

Prism框架中的区域化管理(Region Management)

Prism的 区域化管理(Region Management) 是其核心功能之一,用于实现动态UI组合和模块化布局。通过将界面划分为逻辑区域(Regions),各模块可独立向这些区域注入视图,无需直接操作主窗口控件,从而实现高度解耦和灵活扩展。

1. 核心概念

  • 区域(Region):UI中的占位符容器(如ContentControl、TabControl),用于动态承载视图。
  • 区域管理器(IRegionManager):负责管理区域的生命周期、视图注入和导航。
  • 区域适配器(RegionAdapter):将不同控件(如ItemsControl、TabControl)适配为可管理的区域。

2. 区域的定义与注册

2.1 在XAML中标记区域

使用 prism:RegionManager.RegionName 附加属性定义区域:

  1. "HeaderRegion" />
  2. "MainRegion" />
  3. "SidebarRegion" />

2.2 通过代码动态注册区域

在ViewModel或模块中动态创建区域:

  1. var regionManager = Container.Resolve();
  2. regionManager.Regions.Add("DynamicRegion", new Region());

3. 视图注入与导航

3.1 向区域注入视图

  • 方法1:直接注册视图
    在模块初始化时注册视图到指定区域:
  1. public class OrdersModule : IModule
  2. {
  3. public void OnInitialized(IContainerProvider containerProvider)
  4. {
  5. var regionManager = containerProvider.Resolve();
  6. regionManager.RegisterViewWithRegion("MainRegion", typeof(OrderListView));
  7. }
  8. }
  • 方法2:通过导航请求加载视图
    动态导航到指定视图(支持参数传递):
  1. var parameters = new NavigationParameters();
  2. parameters.Add("orderId", 123);
  3. _regionManager.RequestNavigate("MainRegion", "OrderDetailView", parameters);

3.2 视图导航生命周期

在ViewModel中实现 INavigationAware 接口处理导航事件:

  1. public class OrderDetailViewModel : INavigationAware
  2. {
  3. public void OnNavigatedTo(NavigationContext navigationContext)
  4. {
  5. // 获取参数
  6. var orderId = navigationContext.Parameters.GetValue<int>("orderId");
  7. LoadOrder(orderId);
  8. }
  9. public bool IsNavigationTarget(NavigationContext navigationContext) => true;
  10. public void OnNavigatedFrom(NavigationContext navigationContext)
  11. {
  12. // 清理资源
  13. }
  14. }

4. 区域适配器(支持复杂控件)

Prism内置了多种区域适配器,扩展支持常见控件:

  • ContentControlRegionAdapter:适配 ContentControl(单视图替换)。
  • ItemsControlRegionAdapter:适配 ItemsControl(多视图叠加)。
  • SelectorRegionAdapter:适配 TabControl、ListBox 等(支持选中项切换)。

自定义区域适配器

若需支持特殊控件(如第三方图表容器),可继承 RegionAdapterBase:

  1. public class ChartRegionAdapter : RegionAdapterBase<ChartControl>
  2. {
  3. protected override void Adapt(IRegion region, ChartControl regionTarget)
  4. {
  5. region.Views.CollectionChanged += (sender, args) =>
  6. {
  7. foreach (var view in region.Views)
  8. {
  9. regionTarget.AddSeries(view as ChartSeries);
  10. }
  11. };
  12. }
  13. }
  14. // 注册适配器
  15. protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
  16. {
  17. var mappings = base.ConfigureRegionAdapterMappings();
  18. mappings.RegisterMapping(typeof(ChartControl), Container.Resolve());
  19. return mappings;
  20. }

5. 区域上下文(共享数据)

  • 设置区域上下文:
    向区域传递共享数据,供子视图访问:
_regionManager.Regions["MainRegion"].Context = new SharedData { UserId = 456 };
  • 在视图中获取上下文:
    通过 IRegionMemberLifetime 或依赖注入获取:
  1. public class OrderListView
  2. {
  3. public OrderListView(IRegionManager regionManager)
  4. {
  5. var context = regionManager.Regions["MainRegion"].Context;
  6. }
  7. }

Prism框架中的模块化设计

1. 模块的核心组成

每个模块需实现 IModule 接口,包含两个关键方法:

  1. public interface IModule
  2. {
  3. void RegisterTypes(IContainerRegistry containerRegistry); // 注册依赖
  4. void OnInitialized(IContainerProvider containerProvider); // 模块初始化逻辑
  5. }

2. 模块的创建与配置

2.1 定义模块

  1. public class OrdersModule : IModule
  2. {
  3. // 注册模块专属服务
  4. public void RegisterTypes(IContainerRegistry containerRegistry)
  5. {
  6. containerRegistry.Register();
  7. containerRegistry.RegisterForNavigation("OrderList"); // 注册视图
  8. }
  9. // 初始化模块(如预加载数据、订阅全局事件)
  10. public void OnInitialized(IContainerProvider containerProvider)
  11. {
  12. var regionManager = containerProvider.Resolve();
  13. regionManager.RegisterViewWithRegion("MainRegion", typeof(OrderListView));
  14. }
  15. }

2.2 模块目录配置

通过 ModuleCatalog 定义模块的加载顺序和依赖关系,支持多种配置方式:

  • 代码配置(显式声明):
  1. protected override void ConfigureModuleCatalog(IModuleCatalog catalog)
  2. {
  3. catalog.AddModule()
  4. .AddModule(dependsOn: nameof(OrdersModule)) // 依赖OrdersModule
  5. .AddModule(InitializationMode.OnDemand); // 按需加载
  6. }
  • 文件配置(XML/JSON):
  1. "OrdersModule" Type="MyApp.Orders.OrdersModule, MyApp.Orders" />
  2. "CustomersModule" Type="MyApp.Customers.CustomersModule" StartupLoaded="false" />
  1. protected override IModuleCatalog CreateModuleCatalog()
  2. {
  3. return new ConfigurationModuleCatalog(new Uri("pack://application:,,,/modules.xml"));
  4. }
  • 目录扫描(动态发现):
  1. protected override IModuleCatalog CreateModuleCatalog()
  2. {
  3. return new DirectoryModuleCatalog { ModulePath = @".\Modules" };
  4. }

3. 模块加载策略

  • 按需加载(On-Demand):
    延迟加载模块以减少启动时间,通过代码触发加载:
  1. var moduleManager = containerProvider.Resolve();
  2. moduleManager.LoadModule("ReportsModule");
  • 按顺序加载:
    通过 dependsOn 确保依赖模块优先初始化。
  • 条件加载:
    根据运行时环境(如用户权限)动态决定是否加载模块:
  1. if (user.IsAdmin)
  2. moduleManager.LoadModule("AdminToolsModule");

4. 模块间的通信与解耦

  • 依赖注入:
    模块通过接口共享服务,避免直接依赖实现类。
  1. // 模块A注册服务
  2. public void RegisterTypes(IContainerRegistry registry)
  3. {
  4. registry.Register();
  5. }
  6. // 模块B使用服务
  7. public class ReportViewModel
  8. {
  9. public ReportViewModel(IDataExporter exporter) { ... }
  10. }
  • 事件聚合器:
    跨模块事件通知,实现松耦合交互。
  1. // 模块A发布事件
  2. _eventAggregator.GetEvent().Publish(data);
  3. // 模块B订阅事件
  4. _eventAggregator.GetEvent().Subscribe(RefreshData);
注:本文转载自blog.csdn.net的白白白白纸呀的文章"https://blog.csdn.net/white_papers/article/details/146226062"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

125
微软技术
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top