当前位置: 首页 > news >正文

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 提供了更多的注册方式&#xff0c;适应不同的需求和场景。下面我会全面列出 IContainerRegistry 提供的所有常见注册方式&#xff0c;并附带相应的示例。1. 注册单例&#xff08;Singleton&#xff09; 注册单例类型服务&#xff0c;整个应用生命周期内只会创建一个实例&…...

【ESP32】ESP-IDF开发 | 低功耗管理+RTC唤醒和按键唤醒例程

1. 简介 ESP32支持5种低功耗模式&#xff0c;低功耗管理单元包括调压器、功耗控制器、电源开关单元、电源域隔离单元 (Isolation Cell) 等部分。 1.1 RTC单元 RTC单元是ESP32低功耗管理的核心&#xff0c;可用于管理低功耗模式的进入和退出&#xff0c;控制时钟源、PLL、电源开…...

Windows 局域网IP扫描工具:IPScaner 轻量免安装

IPScaner是一款258KB的工具&#xff0c;具备快捷修改IP、批量扫描、地址计算等功能&#xff0c;自动识别本机IP网段&#xff0c;快速查看IP使用情况&#xff0c;适用于监控维护、企业IT运维等场 软件功能介绍&#xff1a; 1&#xff09;快捷修改本地IP、IP批量扫描、IP地址计算…...

HTML的浮动与定位

1. 浮动 浮动可以使一个元素脱离自己原本的位置&#xff0c;并在父元素的内容区中向左或向右移动&#xff0c;直到碰到父元素内容区的边界或者其它浮动元素为止。 值描述left元素向左浮动right元素向右浮动 普通文档流&#xff1a;浏览器在默认情况下规定一个块元素在父元素…...

【网络安全 | 漏洞挖掘】我如何通过路径遍历实现账户接管

未经许可,不得转载。 文章目录 不久前,我发现了一个我在高中时非常常用的知名应用程序,它在Intigriti上是一个私有程序,本文称之为REDACTED。 我开始参与REDACTED的漏洞赏金计划,这个应用程序在我开始进行黑客攻击之前我已经非常熟悉了。最初我并没有抱太高的期望。 我首…...

DB-GPT系列(四):DB-GPT六大基础应用场景part1

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

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中&#xff0c;DTO(数据传输对象)->BO(业务对象)、BO(业务对象)->PO(持久化对象&#xff0c;有的叫DO&#xff0c;即和数据表映射的实体)等等情况要做转换&#xff0c;这里提供以下转换方式 1、from或者try_from trait实现对象转换 需要转换对象满足接收对象的所有…...

ANN DNN CNN SNN

这些缩写代表了不同类型的人工神经网络&#xff1a; • ANN&#xff08;Artificial Neural Network&#xff09;&#xff1a;人工神经网络&#xff0c;是模仿人脑神经元之间连接和交互方式的计算模型。它由节点&#xff08;或称为“神经元”&#xff09;组成的网络&#xff0c;…...

go语言进阶之并发模式

并发模式 并发模式是指在程序设计中同时处理多个任务或进程的方式&#xff0c;以提高效率和响应性 for select循环模式 for select循环模式通常用于处理并发操作&#xff0c;尤其是在需要等待多个通道时。 select的执行过程主要是以下几步 阻塞等待&#xff0c;直到其中一…...

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 水平顶部导航栏 水平菜单导航栏是应用范围最广的网站导航设计&#xff0c;一般位于页面顶部。它适用性强&#xff0c;几乎适用于所有类型的网站&#xff0c;且设计难度低。若导航过于普通&#xff0c;无法承载复杂信息结构&#xff0c;在内容模块较多时&#xff0c;则需结…...

UNIX网络编程-TCP套接字编程

概述 TCP客户端/服务器程序示例是执行如下步骤的一个回射服务器&#xff1a; 客户端从标准输入读入一行文本&#xff0c;并写给服务器。服务器从网络输入读入这行文本&#xff0c;并回射给客户端。客户端从网络输入读入这行回射文本&#xff0c;并显示在标准输出上。 TCP服务器…...

美团代付微信小程序 read.php 任意文件读取漏洞复现

0x01 产品描述&#xff1a; ‌ 美团代付微信小程序‌是美团点评旗下的一款基于微信小程序技术开发的应用程序功能&#xff0c;它允许用户方便快捷地请求他人为自己支付订单费用。通过微信小程序&#xff0c;用户可以轻松实现代付操作&#xff0c;无需跳转到其他应用或网页…...

centos7 node升级到node18

使用jenkins发布vue3项目提示node18安装失败 错误日志&#xff1a; /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建立随机森林

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

【江苏-无锡】《无锡市市级政务信息化建设及运行维护项目支出预算标准(试行)》 -省市费用标准解读系列10

2023年3月28日&#xff0c;无锡市政府投资评审中心出台《无锡市市级政务信息化建设及运行维护项目支出预算标准&#xff08;试行&#xff09;》&#xff0c;此标准是为进一步提高财政评审效率&#xff0c;规范评审行为&#xff0c;保证评审质量&#xff0c;节约政府投资&#x…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...