前言

控制反转(Inversion of Control)是将对象的创建、依赖管理和生命周期控制从使用这个对象的类转移到别的类,一般情况下交由外部容器来管理,这种外部容器也称为IOC容器,有没有这个容器都可以实现控制反转,容器的好处是对对象做了统一管理,在C#中比较常见的IOC容器是Microsoft.Extensions.DependencyInjection,这里需要注意的是控制反转是一种设计思想,依赖注入就是控制反转的一个具体实现方式。

1、不使用控制反转

下面的代码违反了软件设计中” 对象的创建和使用要分离“的原则,ICamera 对象创建和使用都是在Run类中完成,代码耦合性很高。

     class Run
    {
            //构造函数注入
            public ICamera camera { get; set; }
            
            //无依赖注入
            public Run()
            {
                camera = new Camera_DaHua();
            }
            public void Test()
            {
                camera.OpenCamera();
            }
     }
public Form1()
        {
            InitializeComponent();
        
            Run run = new Run();
            run.Test();
        }

2、使用控制反转

使用IOC容器Microsoft.Extensions.DependencyInjection
在这里插入图片描述

下面的代码中你看不到ICamera对象的创建过程,只能看到它的使用过程,因为对象的创建全部在IOC容器中实现了。

    class Run
    {
            //构造函数注入
            public ICamera camera { get; set; }
            public void Test()
            {
                camera.OpenCamera();
            }
            //构造函数注入
            public Run(ICamera _camera)
            {
                camera = _camera;
            } 
    }
 public Form1()
        {
            InitializeComponent();
          
            var services = new ServiceCollection();
            // 2. 注册服务
            services.AddScoped(typeof(ICamera), typeof(Camera_HaiKang));
            // 3. 构建服务提供者,用于解析服务
            var builder = services.BuildServiceProvider();
            // 4. 从服务提供者中解析并使用服务
            var camera = builder.GetService<ICamera>();
            Run run = new Run(camera);
            run.Test();
        }

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》
7、《C#操作MySql数据库从入门到精通》

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐