prism框架

1.prism 框架在VS中可以安装模板,这样使用起来方便。prism全局都是围绕着自身的逻辑,不关心输入是从哪里来,输出到那里去只是遵守约定,不关心谁接收。它的输入就是DI是被喂进去的。

image

 2.DI(依赖注入)

以下是框架内自动注入的,也就是说在ViewModel中的构造函数可以直接使用,不需要再APP.CS中注册

比如像这个样,构造函数可以随便使用

 public MainWindowViewModel(IRegionManager regionManager, IModuleManager moduleManager, IEventAggregator eventAggregator, IDialogService aaa)

 

类别具体内容(按平台)生命周期核心用途
核心内置服务(全平台) IEventAggregator(事件聚合器) 单例 跨组件通信
  INavigationService(导航服务) 瞬时 页面 / View 导航
  IDialogService(弹窗服务) 单例 标准化弹窗管理
  IContainerRegistry/IContainerProvider(DI 容器接口) 单例 注册 / 解析服务
WPF 专属内置服务 IRegionManager(区域管理器) 单例 管理 WPF 的 Region 容器
  IModuleManager/IModuleCatalog(模块管理) 单例 模块化加载 / 管理
框架内部基础设施 ViewModelLocator、导航管道、容器内部组件 内部管理 框架底层运行(无需关注)

 

还有一种自定义的方式需要手动注册,再App.cs中

containerRegistry.Register<IUserService, UserService>(); // 瞬时(默认)
containerRegistry.RegisterSingleton<ISettingsService, SettingsService>(); // 单例
containerRegistry.Register<LocalDataCache>(); // 无接口的具体类型

像这种注册后全局都可以使用,只要在根容器注册了服务,就是全局可用的,任意模块 / 类的构造函数都能通过依赖注入获取该服务实例

3. View 与 ViewModel 的自动关联注册

如果 View(OrderView)和 ViewModel(OrderViewModel)满足「同命名空间 + View 后缀 / ViewModel 后缀」,Prism 的ViewModelLocator可自动关联,无需手动注册;

但是prism项目模板是不在同一个命名空间内,二十遵循了精准利用了 Prism 的扩展约定。

prism:ViewModelLocator.AutoWireViewModel="True"    这个二是自动关联开关;绑定上下文

小技巧添加以下代码,可再Xaml界面中使用转到定义功能

<!-- 1. 引入设计时命名空间(固定) -->
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             <!-- 2. 引入ViewModel命名空间(替换为你的实际命名空间) -->
             xmlns:vm="clr-namespace:YourApp.ViewModels"
             <!-- Prism自动装配(运行时生效) -->
             prism:ViewModelLocator.AutoWireViewModel="True"
             <!-- 3. 设计时DataContext(仅给VS看,不影响运行) -->
             d:DataContext="{d:DesignInstance Type=vm:OrderViewModel, IsDesignTimeCreatable=False}"

4.

4. 对话框(Dialog)注册

使用IDialogService的弹窗,必须手动注册:
// 注册对话框View+ViewModel
containerRegistry.RegisterDialog<ConfirmDialogView, ConfirmDialogViewModel>();

// 注册带自定义弹窗样式的对话框(WPF)
containerRegistry.RegisterDialog<EditDialogView, EditDialogViewModel>("EditDialog");

 

5. 模块化注册

自定义模块(IModule实现类)需要手动注册,才能被框架加载:
// WPF:App.xaml.cs
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
    // 注册启动时加载的模块
    moduleCatalog.AddModule<UserModule>();
    
    // 注册按需加载的模块
    moduleCatalog.AddModule<OrderModule>(initializationMode: InitializationMode.OnDemand);
}

6. 第三方组件 / 服务

// 注册HttpClient(单例)

containerRegistry.RegisterSingleton(() => new HttpClient { BaseAddress = new Uri("https://api.example.com") });

// 注册数据库上下文

(DbContext) containerRegistry.Register<AppDbContext>();

 

7.区域说明

Prism 的 Region 名称是「应用级全局标识」,不是 “模块级” 或 “局部标识”—— 不管是 Shell、模块 A、模块 B,只要用了同一个 Region 名称(比如都叫ContentRegion),Prism 都会认为它们指向「同一个 Region 容器」(优先认 Shell 中最先注册的那个)。

8.导航传参是瞬时的,传晚之后立刻销毁,时间聚合器是 发布和订阅的,需要手动取消订阅,事件聚合器使用场景就是线程里面的数据进行实时的显示。

9.主要你的类被prism注册过,那么这个类的构造函数中的参数可以使用全局的任何接口。

posted @ 2025-12-22 13:24  灰色淡季  阅读(1)  评论(0)    收藏  举报