当我们使用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;}private void OnDataUpdated(object sender, DataUpdatedEventArgs e){// 处理数据更新事件}
}

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

C#中,System.ComponentModel.Container详解相关推荐

  1. java getproperty_java中System.getProperty()方法详解

    System.out.println("java版本号:" + System.getProperty("java.version")); // java版本号 ...

  2. CC#中List用法介绍详解学习通http://www.bdgxy.com/roundWorker类用法总结学习通http://www.bdgxy.com/

    文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 表格制作excel教程h ...

  3. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  4. java中匿名内部类详解_java 中匿名内部类的实例详解

    搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...

  5. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

  6. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  7. java list 移除_java 中List删除实例详解

    java 中List删除实例详解 1.循环删除List中的元素 public static void main(String[] args) { List t=new ArrayList(); for ...

  8. C#中NameValueCollection类用法详解

    C#中NameValueCollection类用法详解,1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCol ...

  9. C++ 中的this指针详解及实例

    C++ 中的this指针详解及实例 这篇文章主要介绍了C++ 中的this指针详解及实例的相关资料,this指针是类的一个自动生成.自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对 ...

最新文章

  1. JAVA中关于JDBC与JDBC-ODBC数据源连接数据库的区别
  2. 带android小绿人的屏保相册,盘点:那些年我们追过的Android
  3. 如何从用户体验的角度去做一个网站的页面设计
  4. 用友云平台,真正的云原生架构,加速云应用落地 1
  5. ajax前端实时获取数据
  6. 中小微企业一大重要数据解析|司法数据指标与报告维度
  7. C语言字符串中运算符,c语言字符串中找到一个运算符,怎样实现运算
  8. 如何更改webstrom的默认端口63342
  9. 量化投资中的「模型」与「人」
  10. FMS3.5的安装使用
  11. 安装Java时出现‘以下应用程序正在使用需要由此安装程序更新的文件。请关闭这些应用程序’ (已解决)
  12. ”标准答案没出来,我怎么知道我想表达什么?……“这样的话,根本就不仅仅是笑话,而且还是现实
  13. 美剧24中的SAP软件
  14. Mac 序列号不可用导致超时代视频加密视频播放失败
  15. cesium-接入监控视频
  16. 新型冠状病毒传染模型SI、SIS、SIR、SEIR
  17. 转载:80,90后需要提前领悟的至高心法
  18. git config本地信息配置
  19. [娱乐向]如何使用STM32播放篮球视频
  20. 厚屁股的 240Hz 次旗舰 — ROG 枪神 3 评测

热门文章

  1. 【StringBuffer】
  2. 单位冲激信号和数字信号处理
  3. execjs调用第三方js库
  4. 云计算技术 实验三 安装Hadoop系统并熟悉hadoop命令
  5. Google chrome插件 | pagenote 网页标记
  6. PHP学习:PHP+Apache 安装/配置
  7. 2020年自考计算机应用基础和实践是什么,2020年自考计算机应用基础复习重点8
  8. word使用计算机题,巧用Word编题库
  9. 《卓有成效的管理者》——学习心得(一)
  10. Java解析pmml格式机器学习模型