首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Castle IOC 容器內幕故事(下)

     編輯:關於.NET

核心角色回顧

上篇介紹了 WindsorContainer、MicroKernel、組件註冊流程。本篇深入剖析四大核心內部角色:

  1. ComponentModelBuilder 與 Contributors
  2. Contributors 詳細分析
  3. Handlers 分析
  4. ComponentActivator 分析

一、ComponentModelBuilder 與 Contributors

組件註冊時建立 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());
}

八大 Contributors 職責

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 實作分析

所有 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);
    }
}

三、Handlers 分析

官方描述:「它們不自己建構組件,但知道誰來建構。」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);
}

四、ComponentActivator 組件激活器

每個組件關聯一個 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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved