WPF 应用程序中使用 Prism 框架时,有多种方式可以注册服务和依赖项
Prism 提供了更多的注册方式,适应不同的需求和场景。下面我会全面列出 IContainerRegistry 提供的所有常见注册方式,并附带相应的示例。1. 注册单例(Singleton)
注册单例类型服务,整个应用生命周期内只会创建一个实例,所有引用共享同一个实例。public class MyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterSingleton<MyService>();
}
或者指定接口与实现:public interface IMyService { }
public class MyService : IMyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterSingleton<IMyService, MyService>();
}
2. 注册瞬态(Transient)
每次请求都会创建新的实例,适用于不需要共享状态的服务。public class MyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService>();
}
或者注册接口与实现:public interface IMyService { }
public class MyService : IMyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<IMyService, MyService>();
}
3. 注册实例(Instance)
注册一个已经存在的实例,容器将直接使用该实例而不是创建新实例。public class MyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{var instance = new MyService();containerRegistry.RegisterInstance<IMyService>(instance);
}
或者使用已存在的实例:public class MyService { }var instance = new MyService();
containerRegistry.RegisterInstance<IMyService>(instance);
4. 注册带参数的服务
如果服务构造函数需要额外的参数,可以使用 lambda 表达式来提供这些参数。public class MyService
{private readonly string _message;public MyService(string message){_message = message;}public string GetMessage() => _message;
}public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService>(c => new MyService("Hello, Prism!"));
}
5. 注册视图与视图模型(View & ViewModel)
Prism 提供了 RegisterForNavigation 方法来注册视图,并使用 Register 注册视图模型。注册视图:public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterForNavigation<MyView>();
}
注册视图模型:public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyViewModel>();
}
Prism 还支持通过 RegisterForNavigation 为视图配置参数:public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterForNavigation<MyView, MyViewModel>("MyView");
}
6. 注册命令(DelegateCommand)
DelegateCommand 用于创建 UI 命令。可以使用 Register 来注册 DelegateCommand。public class MyViewModel
{public DelegateCommand MyCommand { get; private set; }public MyViewModel(){MyCommand = new DelegateCommand(ExecuteCommand);}private void ExecuteCommand(){// Command logic}
}public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<DelegateCommand>();
}
7. 注册事件聚合器(Event Aggregator)
IEventAggregator 用于在组件之间发送和接收事件。你可以将其注册为单例。public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterSingleton<IEventAggregator, EventAggregator>();
}
8. 注册工厂(Factory)
使用工厂模式注册对象。通常通过工厂方法来动态创建对象。public class MyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService>(c => new MyService());
}
9. 注册泛型类型
可以注册泛型类型,这对于在应用中依赖泛型类的情况非常有用。public class MyService<T> { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService<int>>();
}
10. 注册类型别名
如果希望为一个类型提供别名,可以使用 Register 方法。public class MyService { }public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService>("MyServiceAlias");
}
在解析时,可以使用别名来获取服务:var service = container.Resolve<MyService>("MyServiceAlias");
11. 注册已配置的服务
如果需要在容器中注册一个服务并且该服务需要其他配置(例如在构造时传入参数或者使用特定配置),可以使用 Register 配合 lambda 来进行注册。public class MyService
{private readonly string _config;public MyService(string config){_config = config;}
}public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<MyService>(c => new MyService("Configured"));
}
12. 注册包含生命周期管理的服务
你可以在注册时指定服务的生命周期。通常会使用瞬态(Transient)、单例(Singleton)、或作用域(Scoped)来管理对象的生命周期。public void RegisterTypes(IContainerRegistry containerRegistry)
{// 注册为瞬态服务containerRegistry.Register<MyService>();// 注册为单例服务containerRegistry.RegisterSingleton<IMyService, MyService>();// 注册为作用域服务(适用于 Web 或更复杂的场景)containerRegistry.RegisterScoped<IMyService, MyService>();
}
13. 注册装饰器(Decorator)
Prism 允许你使用装饰器模式来包装服务,从而增加额外的功能或行为。你可以将一个服务注册为另一个服务的装饰器。public interface IMyService
{void Execute();
}public class MyService : IMyService
{public void Execute(){// Service execution logic}
}public class MyServiceDecorator : IMyService
{private readonly IMyService _inner;public MyServiceDecorator(IMyService inner){_inner = inner;}public void Execute(){// Pre-processing logic_inner.Execute();// Post-processing logic}
}public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.Register<IMyService, MyService>();containerRegistry.RegisterDecorator<IMyService, MyServiceDecorator>();
}
14. 注册异步服务
使用 RegisterAsync 来注册异步加载的服务。这个特性在某些需要延迟加载的情况下非常有用。public class MyService
{public async Task InitializeAsync(){// Async initialization logic}
}public void RegisterTypes(IContainerRegistry containerRegistry)
{containerRegistry.RegisterAsync<MyService>(async c =>{var service = new MyService();await service.InitializeAsync();return service;});
}
总结
通过 Prism 的 IContainerRegistry,你可以灵活地注册不同生命周期、参数化、泛型、装饰器等各种类型的服务。上述是最常见的几种注册方式,适用于不同的应用场景。通过这些注册方式,能够实现灵活且高效的依赖注入,帮助你更好地构建模块化和可维护的 WPF 应用。
相关文章:
WPF 应用程序中使用 Prism 框架时,有多种方式可以注册服务和依赖项
Prism 提供了更多的注册方式,适应不同的需求和场景。下面我会全面列出 IContainerRegistry 提供的所有常见注册方式,并附带相应的示例。1. 注册单例(Singleton) 注册单例类型服务,整个应用生命周期内只会创建一个实例&…...

【ESP32】ESP-IDF开发 | 低功耗管理+RTC唤醒和按键唤醒例程
1. 简介 ESP32支持5种低功耗模式,低功耗管理单元包括调压器、功耗控制器、电源开关单元、电源域隔离单元 (Isolation Cell) 等部分。 1.1 RTC单元 RTC单元是ESP32低功耗管理的核心,可用于管理低功耗模式的进入和退出,控制时钟源、PLL、电源开…...

Windows 局域网IP扫描工具:IPScaner 轻量免安装
IPScaner是一款258KB的工具,具备快捷修改IP、批量扫描、地址计算等功能,自动识别本机IP网段,快速查看IP使用情况,适用于监控维护、企业IT运维等场 软件功能介绍: 1)快捷修改本地IP、IP批量扫描、IP地址计算…...
HTML的浮动与定位
1. 浮动 浮动可以使一个元素脱离自己原本的位置,并在父元素的内容区中向左或向右移动,直到碰到父元素内容区的边界或者其它浮动元素为止。 值描述left元素向左浮动right元素向右浮动 普通文档流:浏览器在默认情况下规定一个块元素在父元素…...
【网络安全 | 漏洞挖掘】我如何通过路径遍历实现账户接管
未经许可,不得转载。 文章目录 不久前,我发现了一个我在高中时非常常用的知名应用程序,它在Intigriti上是一个私有程序,本文称之为REDACTED。 我开始参与REDACTED的漏洞赏金计划,这个应用程序在我开始进行黑客攻击之前我已经非常熟悉了。最初我并没有抱太高的期望。 我首…...

DB-GPT系列(四):DB-GPT六大基础应用场景part1
一、基础问答 进入DB-GPT后,再在线对话默认的基础功能就是对话功能。这里我们可以和使用通义千问、文心一言等在线大模型类似的方法, 来和DB-GPT进行对话。 但是值得注意的是,DB-GPT的输出结果是在内置提示词基础之上进行的回答,…...

SpringCloud篇(服务拆分 / 远程调用 - 入门案例)
目录 一、服务拆分原则 二、服务拆分示例 1. 案例需求 2. 案例要求 3. 导入SQL语句 4. 实现思路 4.1. 创建父工程 cloud-demo 管理依赖 依赖导入思路 4.2. 创建子工程 order-servic 4.3. 创建子工程 user-servic 4.4. 创建 cloud_order 数据库和表并插入数据 4.5. …...
Rust 建造者模式
在DDD中,DTO(数据传输对象)->BO(业务对象)、BO(业务对象)->PO(持久化对象,有的叫DO,即和数据表映射的实体)等等情况要做转换,这里提供以下转换方式 1、from或者try_from trait实现对象转换 需要转换对象满足接收对象的所有…...
ANN DNN CNN SNN
这些缩写代表了不同类型的人工神经网络: • ANN(Artificial Neural Network):人工神经网络,是模仿人脑神经元之间连接和交互方式的计算模型。它由节点(或称为“神经元”)组成的网络,…...
go语言进阶之并发模式
并发模式 并发模式是指在程序设计中同时处理多个任务或进程的方式,以提高效率和响应性 for select循环模式 for select循环模式通常用于处理并发操作,尤其是在需要等待多个通道时。 select的执行过程主要是以下几步 阻塞等待,直到其中一…...
Spring Cloud LoadBalancer:负载均衡的服务调用
在微服务系统中,有时候一个服务会部署多个实例,在我们调用这类实例时,如何实现负载均衡的调用呢?这时候就要用到Spring Cloud的负载均衡组件LoadBalancer了 LoadBalancer简介 LoadBalancer是Spring Cloud官方提供的负载均衡组件,通过它能使客户端在多个服务实例之间分发传…...

微信小程序之轮播图
效果图 实现 <swiper class"banner" indicator-dots"true" indicator-color"rgba(255,255,255,1)" indicator-active-color"#ff0000" autoplay"true" interval"100" circular"true"><swi…...
羲和数据集收集器1.3
为了实现所要求的功能,我们需要进一步完善代码,使其能够处理多种格式的输入文件,并生成符合要求的 JSON 格式的输出文件。具体来说,我们完善了以下内容: 增强 extract_qa_pairs_from_content 函数:使其能够识别和处理不同格式的 QA 对。 确保输出文件的格式正确:每个 Q…...
UE--IOS打包失败 AutomationTool exiting with ExitCode=9 (9)
[Remote] Executing build UATHelper: 打包 (IOS): Setting up bundled DotNet SDK UATHelper: 打包 (IOS): /Users/zyh/UE5/Builds/DESKTOP-FKKSVFQ/Y/UE/UE_5.2/Engine/Build/BatchFiles/Mac/../../../Binaries/ThirdParty/DotNet/6.0.302/mac-x64 UATHelper: 打包 (IOS)…...

第8章利用CSS制作导航菜单
8.1 水平顶部导航栏 水平菜单导航栏是应用范围最广的网站导航设计,一般位于页面顶部。它适用性强,几乎适用于所有类型的网站,且设计难度低。若导航过于普通,无法承载复杂信息结构,在内容模块较多时,则需结…...

UNIX网络编程-TCP套接字编程
概述 TCP客户端/服务器程序示例是执行如下步骤的一个回射服务器: 客户端从标准输入读入一行文本,并写给服务器。服务器从网络输入读入这行文本,并回射给客户端。客户端从网络输入读入这行回射文本,并显示在标准输出上。 TCP服务器…...

美团代付微信小程序 read.php 任意文件读取漏洞复现
0x01 产品描述: 美团代付微信小程序是美团点评旗下的一款基于微信小程序技术开发的应用程序功能,它允许用户方便快捷地请求他人为自己支付订单费用。通过微信小程序,用户可以轻松实现代付操作,无需跳转到其他应用或网页…...

centos7 node升级到node18
使用jenkins发布vue3项目提示node18安装失败 错误日志: /var/lib/jenkins/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/Node18/bin/node: /lib64/libm.so.6: version GLIBC_2.27 not found (required by /var/lib/jenkins/tools/jenkins.plugins.node…...

使用Matlab建立随机森林
综述 除了神经网络模型以外,树模型及基于树的集成学习模型是较为常用的效果较好的预测模型。我们以下构建一个随机森林模型。 随机森林是一种集成学习方法,通过构建多个决策树并结合其预测结果来提高模型的准确性和稳定性。在MATLAB中,可以…...

【江苏-无锡】《无锡市市级政务信息化建设及运行维护项目支出预算标准(试行)》 -省市费用标准解读系列10
2023年3月28日,无锡市政府投资评审中心出台《无锡市市级政务信息化建设及运行维护项目支出预算标准(试行)》,此标准是为进一步提高财政评审效率,规范评审行为,保证评审质量,节约政府投资&#x…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...