【WPF】Prism学习(六)

Prism Dependency Injection

在这里插入图片描述

1.依赖注入(Dependency Injection)

1.1. Prism与依赖注入的关系

  • Prism框架一直围绕依赖注入构建,这有助于构建可维护和可测试的应用程序,并减少或消除对静态和循环引用的依赖。

1.2. Prism 7之前的依赖注入问题

  • 在Prism 7之前,Prism的依赖注入主要围绕为Prism实现的各种容器。这导致了一些问题,例如文档可能展示了如何使用一个容器进行操作,但不一定反映了你为应用程序使用的容器的适当API。

1.3. Prism 7引入的新接口

  • Prism 7引入了几个新的接口来抽象Prism对依赖注入的需求。这样做有几个好处,包括:
    • 文档将始终展示你需要做什么,而不需要关心你使用的是哪个依赖注入容器。
    • 这大大简化了需要添加到任何特定容器包中的内容。对于Prism.Forms来说,这减少了每个容器特定项目的3个类:PrismApplicationIContainerExtension的实现,以及一个扩展类来检索底层容器,以防你需要访问它未被Prism实现的API。

1.4. Prism 9的变化

  • 在Prism 9中,Prism IoC层已从Prism.Core中移除,现在独立于Prism发布。这使得我们更容易在所有支持的Prism平台(WPF、Uno Platform、.NET MAUI等)之间共享容器实现。
  • Prism 9还进行了额外的工作,以使容器更好地集成Microsoft.Extensions.DependencyInjection,并为容器作用域场景提供更好的支持,这些场景在Prism.Maui中被广泛使用。

总结来说,Prism框架通过依赖注入提供了一种构建应用程序的方式,使得应用程序更加模块化、易于测试和维护。随着Prism版本的更新,它不断改进对依赖注入的支持,使其更加灵活和易于使用。

2.使用微软的IServiceCollection

2.1. Prism 9.0与IServiceCollection的整合

  • Prism 9.0版本将容器实现从主Prism仓库中分离出来,这样做的好处是可以在不同平台之间共享容器,而不需要与Prism.Core有特定的代码耦合。

2.2. 支持.NET MAUI和Uno.Extensions

  • 通过添加对Microsoft的IServiceCollection的支持,Prism能够更好地支持.NET MAUI应用程序和Uno.Extensions使用的IHostBuilder方法。

2.3. 考虑使用Microsoft库的注册扩展

  • 当使用来自各种Microsoft库的注册扩展时,需要注意这些扩展通常是为Web应用程序量身定制的。例如,如果使用EntityFrameworkCore,DbContext的默认生命周期会被设置为Scoped(有作用域的)。

2.4. 生命周期管理的重要性

  • 对于大多数Prism应用程序,你可能希望将DbContext的生命周期设置为Transient(短暂的),因为Singleton(单例)可能会导致数据库访问问题,如果不同的视图模型或服务同时访问数据库。

2.5. 评估预构建的扩展方法

  • 建议花时间评估任何预构建的扩展方法,以确保注册的服务对于你的应用程序来说具有适当的生命周期。

3.容器(Containers)

Prism是一个流行的.NET框架,用于构建基于MVVM模式的应用程序,它支持依赖注入,这有助于构建可维护和可测试的应用程序,并减少对静态和循环引用的依赖。

  1. Prism团队提供了多个DI容器实现:Prism框架提供了几种不同的DI容器实现,这些容器实现了Prism的IoC(控制反转)抽象。

  2. 容器、可用性和备注:表格列出了几种不同的容器及其可用性和备注。
    在这里插入图片描述

    • DryIoc:这是一个开源的DI容器,可以在NuGet.org上找到,并且支持所有目标平台。

    • Grace:这是一个商业级的DI容器,需要商业许可。

    • Microsoft:这也是一个商业级的DI容器,需要商业许可。

    • Unity:这是一个开源的DI容器,但在Prism中只提供对Xamarin.Forms和WPF的遗留支持。

  3. 注意:虽然DryIoc和Unity容器可以在NuGet.org上找到,但它们仍然受到Prism许可证的约束。这意味着,即使这些容器是开源的,如果你使用它们作为Prism框架的一部分,你仍然需要拥有一个有效的Prism许可证。

相关链接

  • 介绍(Introduction)
  • 命令(Commands)
    • 命令(Commanding)
    • 复合命令(Composite Commands)
    • 异步命令(Async Commands)
    • 错误处理(Error Handling)
  • 依赖注入(Dependency Injection)
    • 依赖注入(Dependency Injection)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习ASP.NET Core的身份认证(基于Cookie的身份认证1)

B/S架构程序可通过Cookie、Session、JWT、证书等多种方式认证用户身份,虽然之前测试过用户登录代码,也学习过开源项目中的登录认证,但其实还是对身份认证疑惑甚多,就比如登录验证后用户信息如何保存、客户端下次连接时如何获取用户…

使用Cursor和Claude AI打造你的第一个App

大家好,使用Cursor和Claude AI打造应用程序是一个结合智能代码辅助和人工智能对话的创新过程。Cursor是一个编程辅助工具,它通过智能代码补全、聊天式AI对话和代码生成等功能,帮助开发者提高编程效率。Claude AI则是一个强大的人工智能平台&a…

ssm152家庭财务管理系统设计与实现+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:家庭财务管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本家庭财务管理系…

《深入理解 Spring MVC 工作流程》

一、Spring MVC 架构概述 Spring MVC 是一个基于 Java 的轻量级 Web 应用框架,它遵循了经典的 MVC(Model-View-Controller)设计模式,将请求、响应和业务逻辑分离,从而构建出灵活可维护的 Web 应用程序。 在 Spring MV…

LeetCode - #139 单词拆分

文章目录 前言摘要1. 描述2. 示例3. 答案题解动态规划的思路代码实现代码解析1. **将 wordDict 转换为 Set**2. **初始化 DP 数组**3. **状态转移方程**4. **返回结果** **测试用例**示例 1:示例 2:示例 3: 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗…

LLM( Large Language Models)典型应用介绍 1 -ChatGPT Large language models

ChatGPT 是基于大型语言模型(LLM)的人工智能应用。 GPT 全称是Generative Pre-trained Transformer。-- 生成式预训练变换模型: Generative(生成式):可以根据输入生成新的文本内容,例如回答问题…

维护在线重做日志

学习目标 解释在线重做日志文件的目的概述在线重做日志文件的结构控制日志开关和检查点多路复用和维护在线重做日志文件使用OMF管理在线重做日志文件获取在线重做日志文件信息 在线重做日志文件提供了在数据库发生故障时重做事务的方法。 每个事务都同步写入重做日志缓冲区&a…

分布式数据库中间件可以用在哪些场景呢

在数字化转型的浪潮中,企业面临着海量数据的存储、管理和分析挑战。华为云分布式数据库中间件(DDM)作为一款高效的数据管理解决方案,致力于帮助企业在多个场景中实现数据的高效管理和应用,提升业务效率和用户体验。九河…

shell(6)if条件判断与for循环结构

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

vulfocus在线靶场:tomcat-pass-getshell 弱口令 速通手册

目录 一、启动环境,访问页面,并登录,账号密码都是tomcat 二、哥斯拉打war包,图解 三、上传war包,图解 四、访问我们直接url/木马文件名/木马文件.jsp,是否存在了 五、 哥斯拉测试连接结果success&…

DICOM核心概念:显式 VR(Explicit VR)与隐式 VR(Implicit VR)在DICOM中的定义与区别

在DICOM(Digital Imaging and Communications in Medicine)标准中,VR(Value Representation) 表示数据元素的值的类型和格式。理解显式 VR(Explicit VR)与隐式 VR(Implicit VR&#…

2、桥接模式

模式解释 百度: 这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的交流调用。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化…

小程序-基于java+SpringBoot+Vue的开放实验室预约管理系统设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

【JavaSE】【网络编程】UDP数据报套接字编程

目录 一、网络编程简介二、Socket套接字三、TCP/UDP简介3.1 有连接 vs 无连接3.2 可靠传输 vs 不可靠传输3.3 面向字节流 vs 面向数据报3.4 双向工 vs 单行工 四、UDP数据报套接字编程4.1 API介绍4.1.1 DatagramSocket类4.1.1.1 构造方法4.1.1.2 主要方法 4.1.2 DatagramPocket…

【K8S系列】Kubernetes Pod节点ImagePullBackOff 状态及解决方案详解【已解决】

在 Kubernetes 中,当某个 Pod 的容器无法从指定的镜像仓库拉取镜像时,Pod 的状态会变为 ImagePullBackOff。这通常是因为指定的镜像不存在、镜像标签错误、认证失败或网络问题等原因。 以下是关于 ImagePullBackOff 的详细分析及解决方案。 1. ImagePull…

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源 由于需要在 Linux 环境下进行一些测试工作,于是决定使用 VMware 虚拟化软件来安装 Ubuntu 24.04 .1操作系统。考虑到测试过程中需要访问 Github ,要使用Docker拉去镜像等外部网络资源,因此产…

前列腺分割:基于边界加权(解决弱边界)、域自适应(少样本)

前列腺分割:基于边界加权(解决弱边界)、域自适应(少样本) 理解发现规律论文大纲观察1. 观察行为2. 变量分析3. 假设提出4. 验证过程 解法拆解 论文:Boundary-weighted Domain Adaptive Neural Network for …

鼠标绘制轮廓

需要对label进行提升&#xff0c;新建MyLabel类&#xff0c;并将其提升到label控件上&#xff0c;详见上篇控件提升 mylabelmouse.h #pragma once #include <QtWidgets/QMainWindow> #include "ui_mylabelmouse.h" #include <QMenu> #include "My…

C语言-详细讲解-冒泡排序与选择排序

1.冒泡排序 冒泡排序是一种比较简单的排序算法。它重复地走访要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。这个名字的由来是因为越小&a…