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

posted @   阿遇而已  阅读(164)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示