程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Castle IOC容器組件生命周期管理

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

編輯:關於.NET

主要內容

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.使用配置文件

<!--出處:http://terrylee.cnblogs.com-->
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <components>
    <component id="comp1" lifestyle="transient">
      <parameters>
        <para>component1 para</para>
      </parameters>
    </component>>
  </components>
</configuration>

2.使用Attribute特性

//出處:http://terrylee.cnblogs.com
[Transient]
public class MyComponent
{
  public MyComponent()
  {
    //
  }
  public MyComponent(string _Str)
  {
    //
  }
}

前面在Castle IOC的內幕故事中我們說過,組件生命方式是由一個叫做LifestyleModelInspector的Contributor來管理的。在LifestyleModelInspector中我們注意到有這樣一段代碼:

public virtual void ProcessModel (IKernel kernel , ComponentModel model )
{
  if (!ReadLifestyleFromConfiguration(model ))
  {
    ReadLifestyleFromType(model );
  }
}
protected virtual bool ReadLifestyleFromConfiguration(ComponentModel model )
{
  //
}
protected virtual void ReadLifestyleFromType(ComponentModel model )
{
  //
}

其中ReadLifestyleFromConfiguration()從配置文件讀取,ReadLifestyleFromType()是從組件的特性讀取。可以看到LifestyleModelInspector首先會去檢查配置文件中的是否指定,如果已經指定了,就會直接返回,否則才去組件特性裡面去查找。由此我們可以得出如下一條重要的結論:

如果同時在配置文件和組件的特性中指定組件生命處理方式,配置文件將覆蓋類中特性指定的。

二.自定義生命處理方式

下面我們來看如何實現自定義的生命處理方式。在這之前,先來看一下生命處理方式中的類結構圖:

圖1

可以看到,所有生命處理方式都實現了接口ILifestyleManager:

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

所以要實現自定義的生命處理方式,只要實現接口IlifestyleManager就可以了,來看一下Castle IOC官方網站提供的一種生命處理方式,實現了對於Web應用程序中的每一次Request都創建一個Singleton實例:

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

對於自定義的生命處理方式,在使用配置文件和特性指定的時候又有些不同

1.使用配置文件

<!--出處:http://terrylee.cnblogs.com-->
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <components>
    <component id="myComponent"
          type="MyLib.MyComponent, MyLib"
          lifestyle="custom"
          customLifestyleType="MyLib.PerWebRequestLifestyleManager, MyLib">
      <parameters>
        <para>component1 para</para>
      </parameters>
    </component>
  </components>
</configuration>

2.使用Attribute特性

//出處:http://terrylee.cnblogs.com
[CustomLifestyle( typeof(PerWebRequestLifestyleManager ) )]
public class MyComponent
{
  public MyComponent()
  {
    //
  }
  //
}

三.生命周期管理

Castle IOC同樣是支持組件生命周期的管理,也就是在組件裝載,初始化,銷毀所出發的行為,分別對應三個接口:IInitializable,ISupportInitialize,IDisposable。這些接口被分為兩組:Commission和Decommission:

Commission

l Castle.Model .IInitializable interface

l System.ComponentModel .ISupportInitialize

Decommission

l System.IDisposable

如果組件實現了這些接口,容器會自動在不同的生命周期調用他們。我們看下面這樣一個例子:

//出處:http://terrylee.cnblogs.com
[Transient]
public class MyComponent : IInitializable, IDisposable
{
  public MyComponent(string _para)
  {
    //
  }
  public void Initialize()
  {
    //
  }
  public void Dispose()
  {
    //
  }
}
在我們使用組件時

//出處:http://terrylee.cnblogs.com
public class App
{
  public static void Main()
  {
    IWindsorContainer container = new WindsorContainer(new XmlInterpreter("../../BasicUsage.xml ") );
        container.AddComponent( "myComponent",
      typeof(MyComponent));
    // Initialize()方法會自動執行
    MyComponent instince = container["myComponent"] as MyComponent;
    // Dispose()方法會自動執行
    container.Release(instince);
  }
}

關於Castle IOC容器組件生命周期管理就介紹到這裡了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved