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

Castle IOC 容器組件生命週期管理

     編輯:關於.NET

五大內建生命週期模式

模式行為
Singleton(預設)全域單一實例,所有請求共享
Transient每次請求建立新實例,等同 new
PerThread每執行緒單例
Pooled物件池模式,釋放回池供下次複用
Custom自訂生命週期管理器

兩種指定方式(配置檔優先於 Attribute)

1. 配置檔

<component id="comp1" lifestyle="transient">
  <parameters><para>component1 para</para></parameters>
</component>

2. Attribute 特性

[Transient]
public class MyComponent { ... }

LifestyleModelInspector 先讀配置檔,有值即返回,否則讀 Attribute。結論:配置檔覆蓋 Attribute。

自訂生命週期實作

實作 ILifestyleManager 介面:

public interface ILifestyleManager : IDisposable
{
    void Init(IComponentActivator componentActivator, IKernel kernel);
    object Resolve();
    void Release(object instance);
}

官方範例:PerWebRequestLifestyleManager(每 HTTP Request 單例)


public class PerWebRequestLifestyleManager : AbstractLifestyleManager
{
    private string PerRequestObjectID = "PerRequestLifestyleManager_" + Guid.NewGuid().ToString();
    public override object Resolve()
    {
        if (HttpContext.Current.Items[PerRequestObjectID] == null)
            HttpContext.Current.Items[PerRequestObjectID] = base.Resolve();
        return HttpContext.Current.Items[PerRequestObjectID];
    }
    public override void Dispose() { }
}

使用方式


// 配置檔
<component id="myComponent" type="MyLib.MyComponent, MyLib"
  lifestyle="custom" customLifestyleType="MyLib.PerWebRequestLifestyleManager, MyLib">...</component>

// Attribute
[CustomLifestyle(typeof(PerWebRequestLifestyleManager))]
public class MyComponent { ... }

生命週期事件介面

容器支援三個階段的自動回呼:

階段介面
Commission(啟動/初始化)Castle.Model.IInitializable、System.ComponentModel.ISupportInitialize
Decommission(銷毀)System.IDisposable

實作範例


[Transient]
public class MyComponent : IInitializable, IDisposable
{
    public MyComponent(string para) { }
    public void Initialize() { /* 初始化邏輯 */ }
    public void Dispose() { /* 清理邏輯 */ }
}

使用時自動觸發


public class App {
    public static void Main() {
        IWindsorContainer container = new WindsorContainer(new XmlInterpreter("../../BasicUsage.xml"));
        container.AddComponent("myComponent", typeof(MyComponent));
        // Initialize() 自動執行
        MyComponent instance = container["myComponent"] as MyComponent;
        // Dispose() 自動執行
        container.Release(instance);
    }
}

掌握生命週期管理,能精準控制組件實例的建立、存活與銷毀時機。

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