| 模式 | 行為 |
|---|---|
| Singleton(預設) | 全域單一實例,所有請求共享 |
| Transient | 每次請求建立新實例,等同 new |
| PerThread | 每執行緒單例 |
| Pooled | 物件池模式,釋放回池供下次複用 |
| Custom | 自訂生命週期管理器 |
<component id="comp1" lifestyle="transient">
<parameters><para>component1 para</para></parameters>
</component>
[Transient]
public class MyComponent { ... }
LifestyleModelInspector 先讀配置檔,有值即返回,否則讀 Attribute。結論:配置檔覆蓋 Attribute。
實作 ILifestyleManager 介面:
public interface ILifestyleManager : IDisposable
{
void Init(IComponentActivator componentActivator, IKernel kernel);
object Resolve();
void Release(object instance);
}
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);
}
}
掌握生命週期管理,能精準控制組件實例的建立、存活與銷毀時機。