前言:
上次写了个容器的文章、这几天又深入的了解了下、今天就说说 容器-组件-服务。
容器:
容器是封装和跟踪零个或更多个组件的对象。在此上下文中,包容是指逻辑包容,而不是直观包容。可以在多种方案下使用组件和容器,包括可视化方案和非可视化方案。
给实现者的说明 要成为容器,类必须实现 IContainer 接口,该接口支持添加、移除和检索组件的方法。
什么是物理包含和逻辑包含?
物理包含:如List<>在内存中就是无里包含、组件实在List<>对象的里面
逻辑包含:容器与组件之间只是逻辑上有包含关系、而不是放到容器内部
其他扩展(容器可以包含容器、互相嵌套)
在.net中将直接或间接实现了System.ComponentModel.IContainer接口的类称之为“容器”,直接或者间接实现了System.ComponentModel.IComponent接口的类称之为组件,容器与组件的关系为“逻辑包含”。另外,容器内严格的规定,必须是“组件”也就是实现了组件接口。
//IContainer接口
public interface IContainer : IDisposable
{
// Methods
void Add(IComponent component);
void Add(IComponent component, string name);
void Remove(IComponent component);
// Properties
ComponentCollection Components { get; }
}
可以看出只要是容器都会有添加删除组件的方法、IContainer接口实现了IDsponsable接口、说明容器都遵循遵守“Dispose”模式(释放模式:回收非托管对象)
资料链接
组件:
关于组件的几点总结
1) 将直接或者间接实现了System.ComponentModel.IComponent接口的类称之为“组件”;
2) 组件是一个类,实现了IComponent接口的特殊的类;
3) 组件一定是类,但类不一定是组件;
4) 组件支持编程可视化。
5) 组件需要遵循“Dispose”模式,因为它实现了IComponent接口,而IComponent接口又实现了IDisposable接口。
<span style="font-size:18px;">//System.ComponentModel.IComponent接口
public interface IComponent : IDisposable
{
// Events
event EventHandler Disposed;
// Properties
ISite Site { get; set; }
}
</span>
ISite的作用其实就是关联一个组件和一个容器、前面说到了这次讲的容器是关联、那就让我们看看ISite接口的代码
<span style="font-size:18px;">public interface ISite : IServiceProvider
{
// Properties
IComponent Component { get; }
IContainer Container { get; }
bool DesignMode { get; }
string Name { get; set; }
}</span>
通过Component属性和Container属性,我们就应该很容易的知道ISite的作用其实就是关联一个组件和一个容器,将一个组件和一个容器关联起来。他们之间的关联就是通过ISite维持的,也就是说,容器可以通过ISite与它内部的组件通信,反过来,组件也可以使用ISite与它所在的容器通信,因此,得出结论如下:
1 容器与组件的通讯关系是通过ISite维持的
2 容器何以作为桥梁、所以每个组件之间也是可以互相通信的(图)
3 既然IContainer实现了IDisposable接口,IComponent接口也实现了IDisposable接口,再加上容器中是存放组件的,因此,我们可以认为,容器还有更重要的一个功能,那就是统一负责它其中的组件的资源释放。当容器Dispose的时候,里面所有的组件都跟着Dispose。
服务
组件与容器关联之后、组件就享受容器的服务、比如上面说的组件与容器关联后、组件就能与容器和其他组件通信、这一点组件自己是做不到的、是容器帮助组件做到的、这就是容器给组件提供的服务、当然服务也不止这个、我们可以写很多服务。
一个容器的例子分享给大家
其中,可以自定义服务,来控制消息格式化。xp .net3.5运行通过,源码下载地址:http://files.cnblogs.com/xiaozhi_5638/Container_Component_Service.rar
总结:
这个例子是在晚上找的、还没看太懂、这两天还是有收获的吧、从使用微软提供的容器List集合,到实现容器和组件的接口、自己写容器、自给自足、相信以后会对容器的理解更加深刻。
参考文章:http://www.cnblogs.com/xiaozhi_5638/archive/2013/04/12/3016892.html
————————————————chenchen————————————————