在Winform中使用依赖注入

51efebe54933b99315a9214d1ed74ced.png

前言

58f7c8cc14e5cb2c901b6aee3e9e54c4.png

ab774a539f867e36dcafa5cb497437be.png

    其实我一直是不太建议在Winform中使用依赖注入的,基于Winform本身的开发特性——灵活又死板,内聚又耦合,所以我一直觉得在对象在需要时创建、灵活实例化是比较合适的,而且Winform开发大概率会碰到循环依赖的问题,目前市面上的IOC容器,我觉得对于这一块的处理并不是特别完美(虽然可以用)。当然,这可以归根到是项目的结构问题,如果你有很强的抽象能力、架构能力,确实可以忽略这个问题。

本文主要通过AutoFac实现在Winform中使用依赖注入,分别注入Service以及Form,以此为基础可以实现一个小项目的蓝本。

5d9483519b9274cc7bbb03451a7f85b0.png

68066df2f4900300d8908388b5fdc78d.gif

870ece332e6e3f8fcd2d759780cdb1ec.jpeg

开发环境:.NET Framework版本:4.8

开发工具:Visual Studio 2022

f0c74824693dbe32a07480e319b3fb9a.png

实现步骤

5ec5657e9c914e749473c5bea6539a4c.png

  1. 首先使用Nuget安装AutoFac。

  2. 分别创建一个IUser接口以及实现类User

public interface IUser
    {
        int Add(int a, int b);
    }


 public class User : IUser
    {
        public int Add(int a, int b)
        {
           return a + b;
        }
    }
  1. 分别创建两个窗体,并在其构造函数中进行注入调用,这里会使用Lazy来解决循环依赖的问题,因为这在Winform开发中是非常常见的一种情况(这里值得注意的是,使用了Lazy的话,千万不能在构造函数中取其Value值)。

public partial class Form1 : Form
    {
        readonly IUser _user;
        readonly Form2 _form2;
        public Form1(IUser user, Form2 form2)
        {
            _user= user;
            _form2= form2;
            InitializeComponent();
        }




       
        public partial class Form2 : Form
    {
        readonly IUser _user;
        readonly Lazy<Form1> _form1;
        public Form2(IUser user, Lazy<Form1> form)
        {
            _user = user;
            _form1=form;
            InitializeComponent();
        }
  1. 分别在窗体中实现对Service(User)的调用,以及窗体之间的相互弹出

//Form1
 private void button1_Click(object sender, EventArgs e)
        {
            int result = _user.Add(4, 5);
            MessageBox.Show(result + "");
        }


        private void button2_Click(object sender, EventArgs e)
        {
            _form2.ShowDialog();
        }


//Form2
 private void button1_Click(object sender, EventArgs e)
        {
            int result = _user.Add(2, 6);
            MessageBox.Show(result + "");
        }


        private void button2_Click(object sender, EventArgs e)
        {
            _form1.Value.Show();
        }
  1. 最后在Program文件中实现IOC容器以及注入

internal static class Program
    {
        public static IContainer Container { get; set; }


        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Register();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(Container.Resolve<Form1>());
            // Application.Run(new Form1());
        }


        static void Register()
        {
            var builder = new ContainerBuilder();
            //服务注入
            builder.RegisterType<User>().As<IUser>();


            //窗体注入
            var dataAccess = Assembly.GetExecutingAssembly();
            builder.RegisterAssemblyTypes(dataAccess)
                   .Where(t => t.BaseType == typeof(Form));


            Container = builder.Build();
        }
    }

961f8eb356ae74ef5842ac81c2cb0c6c.png

实现效果

4cdf216d494facbce50568d66f9f7f51.png

f095019284a1382ca1e2aa8e959b1693.gif

☛☛☛点击此处下载源码☚☚☚

0a61a51abf31231cadcf3e76be2b6116.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值