主要內容
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容器組件生命周期管理就介紹到這裡了。