首页 > 其他分享 >WinForm依赖注入简单使用

WinForm依赖注入简单使用

时间:2024-11-19 10:08:33浏览次数:1  
标签:依赖 nameof Form 实例 注册 PictureBoxTest 服务 WinForm 注入

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,在后续的代码优化过程中可对此予以关注并修正。

标签:依赖,nameof,Form,实例,注册,PictureBoxTest,服务,WinForm,注入
From: https://www.cnblogs.com/ziyuhaokun/p/18554327

相关文章

  • DevExpress WinForms中文教程:Data Grid - 如何创建和管理数据?
    在本教程中您将学习如何在代码中为网格控件创建数据源,还将看到如何应用数据属性使网格应用适当的编辑模式、单元格编辑器和输入验证规则。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观......
  • WinForm学习-PictureBox组件
    PictureBox控件是WindowsForms(WinForm)中用于显示图像的一个常用控件,以下将从多个方面对它进行详细介绍:一、基本概述功能作用:PictureBox控件的核心功能就是在WinForm应用程序的界面上展示图像内容,这些图像可以是多种常见的格式,比如位图(.bmp)、JPEG(.jpg、.jpeg)、GIF(.gif)、PNG(.png......
  • 界面控件DevExpress WinForms v24.2新功能预览 - 支持.NET 9
    DevExpressWinForms 拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!获取DevExpressWinFormsv24.1正式版下载本......
  • 服务器部署篇 | 安装软件和其他依赖
    记录,仅供参考mysqlgogitee代码仓库绑定npm配置背景说明:centos7需要部署go语言编写的系统。mysql参考资料:这里注意:教程写得很好,可以完全按照其步骤进行,本人用的是第二种安装方式。go参考资料:这里注意:如果只能在本地无法翻墙下载安装包的话,可以自己电脑下载好......
  • 2-SQL注入渗透与攻防
    1、SQL注入基础1.1什么是sql注入一、SQL注入概述二、数据库概述1.关系型数据库关系型数据库,存储格式可以直观的反映实体间的关系,和常见的表格比较相似关系型数据库中表与表之间有很多复杂的关联关系的常见的关系型数据库有MySQL、Orcale、PostgreSQL、SQLServer等2.非关......
  • 生成 Windows 窗体 Blazor 应用 (WinForm+Bootstrap Blazor)
    官方文档有介绍如何用WinForm+ Blazor  生成应用,  生成Windows窗体Blazor应用 先按照官方文档启动VisualStudio。在“开始”窗口中,选择“创建新项目”:创建WinForm项目  起名为:WinFormsBlazor框架我们选择:.NET8.0 创建完成项目后,使用NuGet包管理器......
  • 界面控件DevExpress WinForms v24.2新功能预览 - 支持.NET 9
    DevExpressWinForms 拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!获取DevExpressWinFormsv24.1正式版下载DevEx......
  • 东胜物流软件 GetDataListCA SQL注入漏洞复现
    0x01产品简介东胜物流软件是青岛东胜伟业软件有限公司一款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS-SQLserver大型......
  • 解决安装dkms出现依赖问题
    mrc3@wanglab-node3:~$sudoaptinstalldkmsReadingpackagelists...DoneBuildingdependencytree...DoneReadingstateinformation...DoneSomepackagescouldnotbeinstalled.Thismaymeanthatyouhaverequestedanimpossiblesituationorifyouareusing......
  • CTFWeb篇04-SQL注入
    SQL注入什么是SQL注入SQL注入就是指WEB应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数代入数据库查询,攻击者可以通过构造不同的SQL语句来是实现对数据库的任意操作。即通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串......