天天看點

Castle IOC容器元件生命周期管理

主要内容

  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>&lt;!--出處:&lt;a href="javascript:void(0)"&gt;&lt;/a&gt;--&gt;</code>

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code> <code>?&gt;</code>

<code>&lt;</code><code>configuration</code><code>&gt;</code>

<code>  &lt;</code><code>components</code><code>&gt;</code>

<code>    &lt;</code><code>component</code> <code>id</code><code>=</code><code>"comp1"</code> <code>lifestyle</code><code>=</code><code>"transient"</code><code>&gt;</code>

<code>      &lt;</code><code>parameters</code><code>&gt;</code>

<code>        &lt;</code><code>para</code><code>&gt;component1 para&lt;/</code><code>para</code><code>&gt;</code>

<code>      &lt;/</code><code>parameters</code><code>&gt;</code>

<code>    &lt;/</code><code>component</code><code>&gt;&gt;</code>

<code>  &lt;/</code><code>components</code><code>&gt;</code>

<code>&lt;/</code><code>configuration</code><code>&gt;</code>

  2.使用Attribute特性

12

13

<code>//出處:&lt;</code><code>a</code> <code>href</code><code>=</code><code>"javascript:void(0)"</code><code>&gt;/</code><code>a</code><code>&gt;</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>    &lt;</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>&gt;</code>

<code>    &lt;/</code><code>component</code><code>&gt;</code>

<code>//出處:&lt;</code><code>a</code> <code>href</code><code>=</code><code>"javascript:void(0)"</code><code>&gt;&lt;/</code><code>a</code><code>&gt;</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>//出處:&lt;</code><code>a</code> <code>href</code><code>=</code><code>"javascript:void(0)"</code><code>&lt;/</code><code>a</code><code>&gt;</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容器元件生命周期管理就介紹到這裡了。

繼續閱讀