net6 winform使用依赖注入(IOC)

16 篇文章 0 订阅

什么是依赖注入?好处是什么?

依赖注入(DI)是一种设计模式,它可以消除编程代码之间的依赖性,因此可以很容易地管理和测试应用程序。它有三种类型分别为构造函数注入,属性注入以及方法注入。它具有减少依赖性增强组件的可重用性等好处。
通俗的来说我们不通过 new 的方式在类内部创建依赖类的对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类来使用。
好处:
1.减少依赖性
依赖注入可以消除或者减少组件间不必要的依赖性。以降低组件改变时所带来的影响组件
2.增强可重用性
减少组件依赖性可以增强组件的可重用性。如果在不同的上下文中需要某个接口的不同实现,或者只是同一实现的不同配置,则可以将该组件配置为使用该实现。无需更改代码。
3.增加代码的可测试性
依赖注入也增加了组件的可测试性。当依赖项可以注入组件时,意味着可以注入这些依赖项的模拟实现。模拟对象用于测试作为实际实现的替代,并且可以配置模拟对象的行为
4.增强代码的可读性
依赖注入可将依赖项移动到组件的接口。使得更容易看到组件中哪些具有依赖关系,从而使代码更具可读性。
5.减少依赖性承载
依赖性承载会在代码中产生大量“噪音”,使其难以阅读和维护,并且使得组件更难测试。而依赖注入可以减少依赖性承载和静态单例的使用,可以将组件完美的连接在一起

本篇文章示例环境:

visual studio 2022 .net6 winform窗体应用程序

使用

包控制台安装Microsoft.Extensions.DependencyInjectio
在这里插入图片描述
修改Program方法

using Microsoft.Extensions.DependencyInjection;
namespace DataSync
{
    internal static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        { 
            // To customize application configuration such as set high DPI settings or default font,
            // see https://aka.ms/applicationconfiguration.
            ApplicationConfiguration.Initialize();
            //创建服务容器
            var services = new ServiceCollection();
            //添加服务注册
            ConfigureServices(services);

            //先用DI容器生成 serviceProvider, 然后通过 serviceProvider 获取Main Form的注册实例
            var serviceProvider = services.BuildServiceProvider();

            var formMain = serviceProvider.GetRequiredService<Form1>();   //主动从容器中获取FormMain实例, 这是简洁写法
            // var formMain = (FormMain)serviceProvider.GetService(typeof(FormMain));  //更繁琐的写法
            Application.Run(formMain);
        }
        /// <summary>
        /// 注入服务
        /// </summary>
        /// <param name="services"></param>
        public static void ConfigureServices(IServiceCollection services)
        {
            //批量注入可以使用Scrutor或者自己封装
            services.AddScoped<YlbBio>();//

            services.AddScoped(typeof(Form1));
        }
    }
}

使用:在form1的构造方法注入

namespace DataSync
{
    public partial class Form1 : Form
    {
        private readonly YlbBio _YlbBio;
        public Form1(YlbBio YlbBio)
        {
            InitializeComponent();
            _YlbBio = YlbBio;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Log.Information(_YlbBio.Get());



            Log.Debug("debug");
            Log.Warning("warning");
            Log.Error("err");
            Log.Fatal("fatal");

        }
    }
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香煎三文鱼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值