上篇介紹了 WindsorContainer、MicroKernel、組件註冊流程。本篇深入剖析四大核心內部角色:
組件註冊時建立 ComponentModel 的過程,就是依序調用 Contributors 處理組件的過程。DefaultComponentModelBuilder 內建八個 Contributors,各司其職:
protected virtual void InitializeContributors()
{
AddContributor(new ConfigurationModelInspector());
AddContributor(new LifestyleModelInspector());
AddContributor(new ConstructorDependenciesModelInspector());
AddContributor(new PropertiesDependenciesModelInspector());
AddContributor(new MethodMetaInspector());
AddContributor(new LifecycleModelInspector());
AddContributor(new ConfigurationParametersInspector());
AddContributor(new InterceptorInspector());
}
| Contributor | 職責 |
|---|---|
| ConfigurationModelInspector | 處理配置,使用 ConfigurationStore 維護組件連接 |
| LifestyleModelInspector | 生命週期模式:Singleton、Thread、Transient、Pooled、Custom |
| ConstructorDependenciesModelInspector | 收集所有 public 建構函數,存入 ComponentModel.Constructors |
| PropertiesDependenciesModelInspector | 收集所有可寫屬性,支援註冊時或解析時注入 |
| MethodMetaInspector | 檢測配置中的 Method 節點,加入 ComponentModel.Methods |
| LifecycleModelInspector | 處理生命週期介面:IInitializable、ISupportInitialize、IDisposable |
| ConfigurationParametersInspector | 處理配置 parameters 元素,建立 ParameterModel 加入 ComponentModel.Parameters |
| InterceptorInspector | 處理 InterceptorAttribute 或配置 interceptors 元素 |
可透過 AddContributor/RemoveContributor 自訂 Contributors:
public void AddContributor(IContributeComponentModelConstruction contributor) { ... }
public void RemoveContributor(IContributeComponentModelConstruction contributor) { ... }
所有 Contributors 實作 IContributeComponentModelConstruction 介面:
public interface IContributeComponentModelConstruction
{
void ProcessModel(IKernel kernel, ComponentModel model);
}
以 LifecycleModelInspector 為例:
[Serializable]
public class LifecycleModelInspector : IContributeComponentModelConstruction
{
public virtual void ProcessModel(IKernel kernel, ComponentModel model)
{
if (typeof(IInitializable).IsAssignableFrom(model.Implementation))
model.LifecycleSteps.Add(LifecycleStepType.Commission, InitializationConcern.Instance);
if (typeof(ISupportInitialize).IsAssignableFrom(model.Implementation))
model.LifecycleSteps.Add(LifecycleStepType.Commission, SupportInitializeConcern.Instance);
if (typeof(IDisposable).IsAssignableFrom(model.Implementation))
model.LifecycleSteps.Add(LifecycleStepType.Decommission, DisposalConcern.Instance);
}
}
官方描述:「它們不自己建構組件,但知道誰來建構。」Handler 有兩種狀態:Valid(可解析)與 WaitingDependency(等待依賴)。所有 Handler 實作 IHandler:
public enum HandlerState { Valid, WaitingDependency }
public interface IHandler
{
void Init(IKernel kernel);
object Resolve();
void Release(object instance);
HandlerState CurrentState { get; }
ComponentModel ComponentModel { get; }
}
核心邏輯在 Resolve 與 Release:
public override object Resolve()
{
if (CurrentState == HandlerState.WaitingDependency)
{
string message = String.Format("Can't create component '{1}' as it has dependencies to be satisfied. {0}",
ObtainDependencyDetails(), ComponentModel.Name);
throw new HandlerException(message);
}
return lifestyleManager.Resolve();
}
public override void Release(object instance)
{
lifestyleManager.Release(instance);
}
每個組件關聯一個 Activator。預設提供 DefaultComponentActivator,亦可自訂(如透過 Factory 建立、Remoting 物件等)。繼承 AbstractComponentActivator 或 DefaultComponentActivator。
[Serializable]
public abstract class AbstractComponentActivator : IComponentActivator
{
private IKernel kernel;
private ComponentModel model;
private ComponentInstanceDelegate onCreation;
private ComponentInstanceDelegate onDestruction;
protected abstract object InternalCreate();
protected abstract void InternalDestroy(object instance);
public virtual object Create()
{
object instance = InternalCreate();
onCreation(model, instance);
return instance;
}
public virtual void Destroy(object instance)
{
InternalDestroy(instance);
onDestruction(model, instance);
}
}
至此 Castle IOC 內幕故事告一段落。理解這些內部機制,能讓我們更得心應手地使用與擴展 Castle IOC。