[ComVisible(true)] public interface ISite : IServiceProvider { // Properties IComponent Component { get; } IContainer Container { get; } bool DesignMode { get; } string Name { get; set; } } public interface IComponent : IDisposable { // Events event EventHandler Disposed; // Properties ISite Site { get; set; } } public interface IContainer : IDisposable { // Methods void Add(IComponent component); void Add(IComponent component, string name); void Remove(IComponent component); // Properties ComponentCollection Components { get; } } 两篇参考: 设计思考之“IComponent-ISite-IContainer 组合还是继承,这是个问题” System.ComponentModel.Component入门 在第2篇中提出了“IComponent使用了注入依赖(DI)的思想”。 我们看一下他们三个的缺省实现:Component,Container.Site,Container。 Container内部持有IComponentSite的数组,当一个Component加入到container,实际上是先构建了一个包含Component的Site对象,再加入到IComponentSite数组的 当将component加入到Container,Container会调用IComponent接口的setComponentSite方法,传入一个IComponentSite实例。这时,你可以在setComponentSite方法中,通过IComponentSite的getContainer方法获得Container对象,然后调用Container的getComponent方法按名获得其它组件来解决依赖问题。 这种设计其一解决了组件的生命周期问题,即当容器dispose时,将依次调用组件的dispose方法 ;其二是引入了Site这个中间层:站点将 Component 绑定到 Container 并启用它们之间的通讯,同时为该容器提供了一种管理其组件的方法。站点也可以用作容器特定信息、基于组件信息(如组件名)的储存库。 重要参考: |
|