WindsorContainer 是 Castle 的 IOC 容器,構建於 MicroKernel 之上:
圖1:WindsorContainer 位於 MicroKernel 之上
圖2:WindsorContainer 封裝 MicroKernel 並提供擴展點
MicroKernel 輕量、僅依賴 Castle.Model,擴展性極強。WindsorContainer 提供門面,核心仍是 MicroKernel。
圖3:MicroKernel 三大核心組成
WindsorContainer 只是委派給 MicroKernel:
public virtual void AddComponent(string key, Type classType)
{
_kernel.AddComponent(key, classType);
}
public virtual void AddComponent(string key, Type serviceType, Type classType)
{
_kernel.AddComponent(key, serviceType, classType);
}
MicroKernel AddComponent 核心步驟:
public virtual void AddComponent(string key, Type classType)
{
// 參數驗證
ComponentModel model = ComponentModelBuilder.BuildModel(key, classType, classType, null);
RaiseComponentModelCreated(model);
IHandler handler = HandlerFactory.Create(model);
RegisterHandler(key, handler);
}
public ComponentModel BuildModel(string key, Type service, Type classType, IDictionary extendedProperties)
{
ComponentModel model = new ComponentModel(key, service, classType);
if (extendedProperties != null) model.ExtendedProperties = extendedProperties;
foreach (IContributeComponentModelConstruction contributor in contributors)
contributor.ProcessModel(kernel, model);
return model;
}
依序調用八大 Contributors 處理配置、生命週期、建構函數依賴、屬性依賴等。
protected virtual void RaiseComponentModelCreated(ComponentModel model)
{
ComponentModelDelegate eventDelegate = (ComponentModelDelegate)events[ComponentModelCreatedEvent];
if (eventDelegate != null) eventDelegate(model);
}
public virtual IHandler Create(ComponentModel model)
{
IHandler handler = new DefaultHandler(model);
handler.Init(kernel);
return handler;
}
完成整個組件註冊流程。後續文章將詳細剖析 Contributors、Handlers、Activator 等核心角色。