C#中,System.ComponentModel.Container详解

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

        ///  
        /// 必需的设计器变量。
        /// 
        private System.ComponentModel.IContainer components = null;

        ///  
        /// 清理所有正在使用的资源。
        /// 
        /// 如果应释放托管资源,为 true;否则为 false。
        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;
    }

    private void OnDataUpdated(object sender, DataUpdatedEventArgs e)
    {
        // 处理数据更新事件
    }
}

在上述示例中,我们在IDataAccessLayer接口中定义了一个DataUpdated事件,并在DataAccessLayer类中实现了该事件。我们还在ServiceLayer类的构造函数中订阅了该事件,并在OnDataUpdated方法中处理事件。这样,当数据更新时,DataAccessLayer类会自动触发DataUpdated事件,从而通知相关的ServiceLayer对象。

你可能感兴趣的:(C#,c#,开发语言)