[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; }
}
兩篇參考:
設(shè)計(jì)思考之“IComponent-ISite-IContainer 組合還是繼承,這是個(gè)問題”
System.ComponentModel.Component入門
在第2篇中提出了“IComponent使用了注入依賴(DI)的思想”。
我們看一下他們?nèi)齻€(gè)的缺省實(shí)現(xiàn):Component,Container.Site,Container。
Container內(nèi)部持有IComponentSite的數(shù)組,當(dāng)一個(gè)Component加入到container,實(shí)際上是先構(gòu)建了一個(gè)包含Component的Site對象,再加入到IComponentSite數(shù)組的
當(dāng)將component加入到Container,Container會調(diào)用IComponent接口的setComponentSite方法,傳入一個(gè)IComponentSite實(shí)例。這時(shí),你可以在setComponentSite方法中,通過IComponentSite的getContainer方法獲得Container對象,然后調(diào)用Container的getComponent方法按名獲得其它組件來解決依賴問題。
也可以調(diào)用IComponentSite的getService(class)方法按類型來獲取其它組件(Component的getService(class)方法,只是簡單的調(diào)用IComponentSite上的getService(class)。
這種設(shè)計(jì)其一解決了組件的生命周期問題,即當(dāng)容器dispose時(shí),將依次調(diào)用組件的dispose方法 ;其二是引入了Site這個(gè)中間層:站點(diǎn)將 Component 綁定到 Container 并啟用它們之間的通訊,同時(shí)為該容器提供了一種管理其組件的方法。站點(diǎn)也可以用作容器特定信息、基于組件信息(如組件名)的儲存庫。
重要參考: