主要内容
1.生命處理方式
2.自定義生命處理方式
3.生命周期處理
一.生命處理方式
我們通常建立一個元件的執行個體使用new關鍵字,這樣每次建立出來的都是一個新的執行個體,如果想要元件隻有一個執行個體,我們會使用Singleton模式。在Castle IOC中,它支援我們對于元件的執行個體進行控制,也就是說我們可以透明的管理一個元件擁有多少個執行個體。Castle IOC容器提供了如下幾種生命處理方式:
l Singleton:一個元件隻有一個執行個體被建立,所有請求的客戶使用程式得到的都是同一個執行個體,同時這也是Castle IOC容器預設的一種處理方式。
l Transient:這種處理方式與我們平時使用new的效果是一樣的,對于每次的請求得到的都是一個新的執行個體。
l PerThread:對于每一個線程來說是使用了Singleton,也就是每一個線程得到的都是同一個執行個體。
l Pooled:對象池的處理方式,對于不再需用的執行個體會儲存到一個對象池中。
l Custom:自定義的生命處理方式。
我們可以通過以下兩種方式來指定元件的生命處理方式,如果不指定,則為Singleton方式:
1.使用配置檔案
輕按兩下代碼全選
1
2
3
4
5
6
7
8
9
10
11
<code><!--出處:<a href="javascript:void(0)"></a>--></code>
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code> <code>?></code>
<code><</code><code>configuration</code><code>></code>
<code> <</code><code>components</code><code>></code>
<code> <</code><code>component</code> <code>id</code><code>=</code><code>"comp1"</code> <code>lifestyle</code><code>=</code><code>"transient"</code><code>></code>
<code> <</code><code>parameters</code><code>></code>
<code> <</code><code>para</code><code>>component1 para</</code><code>para</code><code>></code>
<code> </</code><code>parameters</code><code>></code>
<code> </</code><code>component</code><code>>></code>
<code> </</code><code>components</code><code>></code>
<code></</code><code>configuration</code><code>></code>
2.使用Attribute特性
12
13
<code>//出處:<</code><code>a</code> <code>href</code><code>=</code><code>"javascript:void(0)"</code><code>>/</code><code>a</code><code>></code>
<code>[Transient]</code>
<code>public class MyComponent</code>
<code>{</code>
<code> public MyComponent()</code>
<code> {</code>
<code> //</code>
<code> }</code>
<code> public MyComponent(string _Str)</code>
<code>}</code>
前面在Castle IOC的内幕故事中我們說過,元件生命方式是由一個叫做LifestyleModelInspector的Contributor來管理的。在LifestyleModelInspector中我們注意到有這樣一段代碼:
14
15
<code>public virtual void ProcessModel(IKernel kernel, ComponentModel model)</code>
<code> if (!ReadLifestyleFromConfiguration(model))</code>
<code> ReadLifestyleFromType(model);</code>
<code>protected virtual bool ReadLifestyleFromConfiguration(ComponentModel model)</code>
<code> //</code>
<code>protected virtual void ReadLifestyleFromType(ComponentModel model)</code>
<code> //</code>
其中ReadLifestyleFromConfiguration()從配置檔案讀取,ReadLifestyleFromType()是從元件的特性讀取。可以看到LifestyleModelInspector首先會去檢查配置檔案中的是否指定,如果已經指定了,就會直接傳回,否則才去元件特性裡面去查找。由此我們可以得出如下一條重要的結論:
如果同時在配置檔案群組件的特性中指定元件生命處理方式,配置檔案将覆寫類中特性指定的。
二.自定義生命處理方式
下面我們來看如何實作自定義的生命處理方式。在這之前,先來看一下生命處理方式中的類結構圖:
圖1
可以看到,所有生命處理方式都實作了接口ILifestyleManager:
<code>public interface ILifestyleManager : IDisposable</code>
<code> void Init(IComponentActivator componentActivator, IKernel kernel);</code>
<code> object Resolve();</code>
<code> void Release(object instance);</code>
是以要實作自定義的生命處理方式,隻要實作接口IlifestyleManager就可以了,來看一下Castle IOC官方網站提供的一種生命處理方式,實作了對于Web應用程式中的每一次Request都建立一個Singleton執行個體:
16
<code>public class PerWebRequestLifestyleManager : AbstractLifestyleManager</code>
<code> private string PerRequestObjectID = "PerRequestLifestyleManager_" + Guid.NewGuid().ToString();</code>
<code> public override object Resolve()</code>
<code> if(HttpContext.Current.Items[PerRequestObjectID] == null)</code>
<code> {</code>
<code> // Create the actual object</code>
<code> HttpContext.Current.Items[PerRequestObjectID] = base.Resolve();</code>
<code> }</code>
<code> return HttpContext.Current.Items[PerRequestObjectID];</code>
<code> public override void Dispose()</code>
對于自定義的生命處理方式,在使用配置檔案和特性指定的時候又有些不同
<code> <</code><code>component</code> <code>id</code><code>=</code><code>"myComponent"</code>
<code> </code><code>type</code><code>=</code><code>"MyLib.MyComponent, MyLib"</code>
<code> </code><code>lifestyle</code><code>=</code><code>"custom"</code>
<code> </code><code>customLifestyleType</code><code>=</code><code>"MyLib.PerWebRequestLifestyleManager, MyLib"</code><code>></code>
<code> </</code><code>component</code><code>></code>
<code>//出處:<</code><code>a</code> <code>href</code><code>=</code><code>"javascript:void(0)"</code><code>></</code><code>a</code><code>></code>
<code>[CustomLifestyle( typeof(PerWebRequestLifestyleManager ) )]</code>
三.生命周期管理
Castle IOC同樣是支援元件生命周期的管理,也就是在元件裝載,初始化,銷毀所出發的行為,分别對應三個接口:IInitializable,ISupportInitialize,IDisposable。這些接口被分為兩組:Commission和Decommission:
Commission
l Castle.Model.IInitializable interface
l System.ComponentModel.ISupportInitialize
Decommission
l System.IDisposable
如果元件實作了這些接口,容器會自動在不同的生命周期調用他們。我們看下面這樣一個例子:
17
<code>//出處:<</code><code>a</code> <code>href</code><code>=</code><code>"javascript:void(0)"</code><code></</code><code>a</code><code>></code>
<code>public class MyComponent : IInitializable, IDisposable</code>
<code> public MyComponent(string _para)</code>
<code> public void Initialize()</code>
<code> public void Dispose()</code>
在我們使用元件時
<code>public class App</code>
<code> public static void Main()</code>
<code> IWindsorContainer container = new WindsorContainer(new XmlInterpreter("../../BasicUsage.xml") );</code>
<code> container.AddComponent( "myComponent",</code>
<code> typeof(MyComponent));</code>
<code> // Initialize()方法會自動執行</code>
<code> MyComponent instince = container["myComponent"] as MyComponent;</code>
<code> // Dispose()方法會自動執行</code>
<code> container.Release(instince);</code>
關于Castle IOC容器元件生命周期管理就介紹到這裡了。