分享

IComponent、IContainer、ISite

 碧海山城 2010-01-05

[ComVisible(true)]

public interface ISite : IServiceProvider

{

// Properties

IComponent Component { get; }

IContainer Container { get; }

bool DesignMode { get; }

string Name { getset; }

}

public interface IComponent : IDisposable

{

// Events

event EventHandler Disposed;

// Properties

ISite Site { getset; }

}

  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,实际上是先构建了一个包含ComponentSite对象,再加入到IComponentSite数组的

当将component加入到Container,Container会调用IComponent接口的setComponentSite方法,传入一个IComponentSite实例。这时,你可以在setComponentSite方法中,通过IComponentSitegetContainer方法获得Container对象,然后调用ContainergetComponent方法按名获得其它组件来解决依赖问题。
也可以调用IComponentSitegetService(class)方法按类型来获取其它组件(ComponentgetService(class)方法,只是简单的调用IComponentSite上的getService(class)

这种设计其一解决了组件的生命周期问题,即当容器dispose时,将依次调用组件的dispose方法 ;其二是引入了Site这个中间层:站点将 Component 绑定到 Container 并启用它们之间的通讯,同时为该容器提供了一种管理其组件的方法。站点也可以用作容器特定信息、基于组件信息(如组件名)的储存库。


重要参考:

TSS Featured Entry: Lightweight Containers and Plugin Architectures: Dependency Injection and Dynamic Service Locators in .NET

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多