相关文章推荐
光明磊落的铁链  ·  ant design ...·  4 月前    · 
豪爽的小狗  ·  Android Studio - ...·  1 年前    · 

C#中,System.ComponentModel.Container详解

2 天前

当我们使用WinForm编程时,经常会看到System.ComponentModel.IContainer components = null这一语句定义,但是经常对它忽略,这次就认真对它总结一下;

        /// <summary> 
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary> 
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
            if (disposing && (components != null))
                components.Dispose();
            base.Dispose(disposing);
        components = new System.ComponentModel.Container();

Container是一个提供容器化服务的类。它提供了管理组件的功能,比如添加组件、移除组件、获取组件等。

Container 是一个可包含和管理零件(components)的容器类。零件是用于组成整个应用程序的基本构建块,包括窗体、控件、数据访问对象等等。 Container 提供了添加、移除和获取零件的方法,以及实现IContainer接口。在实际应用中,通常我们在使用控件时,会将其添加到容器中,这样可以方便地对控件进行管理,也可以方便地进行批量操作。

Container 类还支持使用事件来管理零件之间的关系。当容器中的零件发生某些事件时,容器会触发相应的事件,从而允许其他零件对其作出反应。这样可以在零件之间建立一些复杂的关系,例如,一个零件的事件触发了另一个零件的操作。

在窗体应用程序中,通常在窗体的构造函数中创建一个 Container 对象,然后将需要的控件添加到容器中。在窗体关闭时,容器会自动删除所有控件,从而避免了内存泄漏等问题。

以下是Container的一些方法和属性:

  • Add(IComponent):将组件添加到容器中。
  • Add(IComponent, String):将具有指定名称的组件添加到容器中。
  • Remove(IComponent):从容器中移除组件。
  • Components:获取容器中所有组件的集合。

以下是一个使用Container的例子,演示如何将控件添加到容器中:

using System;
using System.ComponentModel;
using System.Windows.Forms;
class MyButton : Button
    public MyButton(IContainer container)
        container.Add(this);
        this.Text = "Hello, World!";
        this.Size = new System.Drawing.Size(100, 50);
class Program
    static void Main()
        var form = new Form();
        var container = new Container();
        var button = new MyButton(container);
        form.Controls.Add(button);
        Application.Run(form);
}

在上面的例子中,我们创建了一个MyButton类,并在构造函数中将其添加到容器中。在Main方法中,我们创建了一个Form对象和一个容器对象,然后创建了一个MyButton对象,将其添加到窗体的控件集合中,并运行了应用程序。

容器化服务在构建可重用的组件时非常有用。它允许你将组件组织在一起,方便地添加和移除组件,并提供了一些方便的功能,如自动释放资源等。

同时,Container类通常用于管理应用程序中的对象和组件之间的关系。它可以用来管理数据访问层,服务层和UI层之间的关系,并通过事件来通知相关对象。

// 创建容器对象
var container = new Container();
// 将数据访问层组件添加到容器中
container.Register<IDataAccessLayer, DataAccessLayer>();
// 将服务层组件添加到容器中,并注入数据访问层组件
container.Register<IServiceLayer>(() => new ServiceLayer(container.Resolve<IDataAccessLayer>()));
// 将UI层组件添加到容器中,并注入服务层组件
container.Register<IUserInterface>(() => new UserInterface(container.Resolve<IServiceLayer>()));
// 获取UI层组件实例,并调用相关方法
var userInterface = container.Resolve<IUserInterface>();
userInterface.Run();

在上述示例中,我们创建了一个Container对象,并使用Register方法将三个组件(数据访问层,服务层和UI层)添加到容器中。我们使用Resolve方法获取UI层组件的实例,并调用其Run方法。在这个过程中,Container类会自动将UI层组件的依赖项(即服务层组件)和服务层组件的依赖项(即数据访问层组件)注入到相应的组件中。

通过这种方式,我们可以轻松地管理组件之间的依赖关系,并通过事件来通知相关对象。例如,我们可以定义一个事件来通知服务层组件数据已经更新,如下所示:

public interface IDataAccessLayer
    event EventHandler<DataUpdatedEventArgs> DataUpdated;
    void UpdateData(object data);
public class DataAccessLayer : IDataAccessLayer
    public event EventHandler<DataUpdatedEventArgs> DataUpdated;
    public void UpdateData(object data)
        // 更新数据
        // 触发事件通知相关对象
        DataUpdated?.Invoke(this, new DataUpdatedEventArgs());
public class ServiceLayer : IServiceLayer
    private readonly IDataAccessLayer _dataAccessLayer;
    public ServiceLayer(IDataAccessLayer dataAccessLayer)
        _dataAccessLayer = dataAccessLayer;
        // 订阅数据更新事件
        _dataAccessLayer.DataUpdated += OnDataUpdated;