WinForm依赖注入简单使用

news/2024/11/19 10:15:21/文章来源:https://www.cnblogs.com/ziyuhaokun/p/18554327

Program.cs

using Microsoft.Extensions.DependencyInjection;
using WinFormsApp1.Helper;namespace WinFormsApp1;internal static class Program
{// 服务容器,用于存储和提供已注册的服务public static IServiceProvider ServiceProvider { get; set; }[STAThread]static void Main(){// 初始化应用程序配置ApplicationConfiguration.Initialize();// 配置服务容器var serviceCollection = new ServiceCollection().InJection();// 构建服务提供者ServiceProvider = serviceCollection.BuildServiceProvider();// 从服务提供者中获取指定键对应的Form类型服务var form = ServiceProvider.GetKeyedService<Form>(nameof(PictureBoxTest));// 启动应用程序并传入获取到的Form实例,使应用程序开始运行并展示相应界面Application.Run(form);}
}

DIHelper.cs

using Microsoft.Extensions.DependencyInjection;namespace WinFormsApp1.Helper;public static class DIHelper
{// 扩展方法,用于向IServiceCollection中注册特定的Form服务public static IServiceCollection InJection(this IServiceCollection service){// 以nameof(BaseControlTest)为键,注册BaseControlTest类型的Form为单例服务service.AddKeyedSingleton<Form, BaseControlTest>(nameof(BaseControlTest));// 以nameof(PictureBoxTest)为键,注册PictureBoxTest类型的Form为单例服务service.AddKeyedSingleton<Form, PictureBoxTest>(nameof(PictureBoxTest));return service;}
}

以下是关于本代码中所运用的依赖注入方法的详细阐述:

一、整体流程概述

Program.cs文件的Main方法中,整个依赖注入及应用程序启动的流程如下:

首先,执行ApplicationConfiguration.Initialize();语句,以此完成应用程序配置的初始化操作,这一步骤为后续的程序运行奠定了基础配置环境。

随后,创建一个ServiceCollection的实例,并调用自定义的扩展方法InJection对其进行服务容器的配置操作。通过该扩展方法,能够向服务容器中注册所需的各类服务。

在完成服务容器的配置后,利用已配置好的ServiceCollection实例构建出IServiceProvider,此即为服务提供者。它扮演着在应用程序运行过程中提供已注册服务的关键角色。

最后,通过ServiceProvider.GetKeyedService<Form>(nameof(PictureBoxTest));语句,依据特定的键(在此为nameof(PictureBoxTest))从服务提供者中获取对应的Form类型服务实例。接着,将获取到的该Form实例传递给Application.Run方法,从而启动应用程序的消息循环,使应用程序得以正常运行并展示出相应的界面。

二、服务注册机制

DIHelper.cs文件中,定义了DIHelper静态类,其中包含了用于服务注册的扩展方法InJection

该扩展方法主要针对IServiceCollection类型进行扩展,其接收一个IServiceCollection实例作为参数(此参数在Program.csMain方法中进行创建并传入)。

InJection扩展方法内部,借助AddKeyedSingleton方法实现了两种不同类型的Form服务注册操作:

其一,以nameof(BaseControlTest)作为键,将BaseControlTest类型的Form注册为单例服务。这意味着在整个应用程序的生命周期内,只会存在一个该类型的Form实例,并且该实例将在需要时由服务提供者统一提供。

其二,以nameof(PictureBoxTest)为键,把PictureBoxTest类型的Form同样注册为单例服务。其原理与上述类似,确保在应用程序运行过程中,对于该类型Form服务的获取始终指向同一个实例。

三、服务获取与应用

回到Program.csMain方法中,当成功构建服务提供者ServiceProvider之后:

通过ServiceProvider.GetKeyedService<Form>(nameof(PictureBoxTest));这一语句,依据nameof(PictureBoxTest)这个特定的键,从服务提供者中准确获取到对应的Form类型服务实例。此处所获取到的实例,实际上就是之前在服务注册阶段以nameof(PictureBoxTest)为键所注册的PictureBoxTest类型的Form服务实例(前提是假设PictureBoxTest是一个继承自Form的具体类型)。

最终,将获取到的Form实例传递给Application.Run方法,以此启动应用程序并使其能够利用所注入的服务来完成相关的功能。具体的功能实现则取决于PictureBoxTest等各类表单类内部的具体逻辑设计。

值得一提的是,在代码中可能存在一处细微的瑕疵,即InJection方法名或许应当为Injection,在后续的代码优化过程中可对此予以关注并修正。

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

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

相关文章

值得推荐的IT公司名单(广州篇)

广州,作为中国南方的重要城市,不仅历史悠久,而且在科技创新方面也具有极高的活力。特别是在IT领域,广州孕育了许多知名企业和创业公司,成为众多技术人才的聚集地。本文将介绍一些在广州值得去的IT公司,为那些希望在广州发展的技术人才提供参考。 互联网大厂 1、腾讯:作为…

项目经理必备:如何通过管理工具提高执行效率?

在瞬息万变的商业环境中,项目经理如同掌舵人,引领团队穿越风浪,确保项目按时、按质、按预算完成。然而,面对日益复杂的项目需求和不断变化的市场环境,仅凭传统的管理方式已难以满足高效执行的需求。此时,借助先进的项目管理工具,成为了项目经理提升执行效率、实现项目成…

PAM限制实测

计算节点pam限制调度系统slurm提供了pam插件,可以实现如下功能: 当且仅当计算节点运行普通用户作业的情况下,该用户才可以通过ssh登录该计算节点。 计算节点的调度系统安装后,在/lib64/security下存在如下三个库文件: /lib64/security/pam_slurm_adopt.a /lib64/security/…

linux学习day02_常用命令学习

1、那个 ~ 符号代表的是“使用者的主文件夹”的意思,他是个“变量!”举例来说,root的主文件夹在/root, 所以 ~ 就代表/root的意思 至于提示字符方面,在Linux当中,默认root的提示字符为 # ,而一般身份使用者的提示字符 为 $ .在 Linux 系统中,英文大小写字母是不一样的。…

赋能业务,驱动未来,科华数据召开CRM平台升级项目启动会

11月13日,全球卓越的智慧电能解决方案提供商-科华数据股份有限公司(以下简称“科华数据”)CRM平台升级项目启动会在厦门顺利举行。科华集团总裁陈四雄、科华数能总裁崔剑、科华数通副总裁林清民、纷享销客高级副总裁江水、中南战区交付总经理徐延涛、深圳分公司总经理杨小会…

使用Pytorch构建视觉语言模型(VLM)

视觉语言模型(Vision Language Model,VLM)正在改变计算机对视觉和文本信息的理解与交互方式。本文将介绍 VLM 的核心组件和实现细节,可以让你全面掌握这项前沿技术。我们的目标是理解并实现能够通过指令微调来执行有用任务的视觉语言模型。 总体架构VLM 的总体架构包括:图…

实现高性能数据同步:旺店通数据写入金蝶云星空

高效数据集成案例:从旺店通到金蝶云星空旺店通其他出库单同步--114:从旺店通企业奇门到金蝶云星空的数据集成案例 在现代企业的运营中,数据的高效流动和精准管理是提升业务效率的关键。本文将分享一个实际运行的系统对接集成案例——“旺店通其他出库单同步--114”,展示如何…

高效团队如何破除跨部门协作的瓶颈?这篇文章告诉你!

在瞬息万变的商业环境中,企业面临着愈加复杂的挑战:跨部门的协作如何更高效?资源分配如何更精准?项目进度如何实时可控?这一系列问题的解决方案,不再仅仅依赖传统的经验管理,而是逐步转向技术驱动。项目管理软件正是在这样的需求场景中诞生,并快速成为各行业不可或缺的…

StarRocks 物化视图刷新流程及原理

前段时间给 StarRocks 的物化视图新增了一个特性,那也是我第一次接触 StarRocks,因为完全不熟悉这个数据库,所以很多东西都是从头开始了解概念。 为了能顺利的新增这个特性(具体内容可以见后文),我需要把整个物化视图的流程串联一遍,于是便有了这篇文章。 在开始之前简单…

不能用AI解决的RSA题目

RSA基础 e,n是公开钥匙 d是私用钥匙 c是密文 m是明文(包含flag) n = pq d = invert(e, (p-1)(q-1)) m = pow(c, d, n) # 解密 flag = long_to_bytes(m) #转文字1、相邻素数 q = gmpy2.next_prime(p) p和q挨得很近解题代码: from Crypto.Util.number import * from…

人工智能模型训练技术,正则化!

前一篇:《人工智能模型训练技术:随机失活,丢弃法,Dropout》 序言:让人工智能模型变得更“聪明”的方法之一,就是减少“过拟合”(读死书)的问题,从而提升模型的“泛化能力”,也就是它面对新问题时的适应能力。在前面,我们讲解了最常用的“随机丢弃”法,本节将带大家…

AlmaLinux 9.5 正式版发布 - RHEL 二进制兼容免费发行版

AlmaLinux 9.5 正式版发布 - RHEL 二进制兼容免费发行版AlmaLinux 9.5 正式版发布 - RHEL 二进制兼容免费发行版 由社区提供的免费 Linux 操作系统,RHEL 二进制兼容发行版 请访问原文链接:https://sysin.org/blog/almalinux-9/ 查看最新版。原创作品,转载请保留出处。 作者主…