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…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
