IoC容器的對(duì)象生存期管理
如果你一直在使用IoC容器,你可能已經(jīng)使用過(guò)了一些對(duì)象生存期管理模型(Object Lifetime Management)。通過(guò)對(duì)對(duì)象生存期的管理,將使對(duì)象的復(fù)用成為可能。同時(shí)其使容器可以控制如何創(chuàng)建和管理對(duì)象實(shí)例。
Unity提供的對(duì)象生存期管理模型是通過(guò)從抽象類(lèi)LifetimeManager的派生類(lèi)來(lái)完成。Unity將為每個(gè)類(lèi)型的注冊(cè)創(chuàng)建生存期管理器。每當(dāng)UnityContainer需要?jiǎng)?chuàng)建一個(gè)新的對(duì)象實(shí)例時(shí),將首先檢測(cè)該對(duì)象類(lèi)型的生存期管理器,是否已有一個(gè)對(duì)象實(shí)例可用。如果沒(méi)有對(duì)象實(shí)例可用,則UnityContainer將基于配置的信息構(gòu)造該對(duì)象實(shí)例并將該對(duì)象交予對(duì)象生存期管理器。
LifetimeManager
LifetimeManager是一個(gè)抽象類(lèi),其實(shí)現(xiàn)了ILifetimePolicy接口。該類(lèi)被作為所有內(nèi)置或自定義的生存期管理器的父類(lèi)。它定義了3個(gè)方法: GetValue - 返回一個(gè)已經(jīng)存儲(chǔ)在生存期管理器中對(duì)象實(shí)例。 SetValue - 存儲(chǔ)一個(gè)新對(duì)象實(shí)例到生存期管理器中。 RemoveValue - 從生存期管理器中將已存儲(chǔ)的對(duì)象實(shí)例刪除。UnityContainer的默認(rèn)實(shí)現(xiàn)將不會(huì)調(diào)用此方法,但可在定制的容器擴(kuò)展中調(diào)用。
Unity內(nèi)置了6種生存期管理模型,其中有2種即負(fù)責(zé)對(duì)象實(shí)例的創(chuàng)建也負(fù)責(zé)對(duì)象實(shí)例的銷(xiāo)毀(Disposing)。
•TransientLifetimeManager - 為每次請(qǐng)求生成新的類(lèi)型對(duì)象實(shí)例。 (默認(rèn)行為)
•ContainerControlledLifetimeManager - 實(shí)現(xiàn)Singleton對(duì)象實(shí)例。 當(dāng)容器被Disposed后,對(duì)象實(shí)例也被Disposed。
•HierarchicalifetimeManager - 實(shí)現(xiàn)Singleton對(duì)象實(shí)例。但子容器并不共享父容器實(shí)例,而是創(chuàng)建針對(duì)字容器的Singleton對(duì)象實(shí)例。當(dāng)容器被Disposed后,對(duì)象實(shí)例也被Disposed。
•ExternallyControlledLifetimeManager - 實(shí)現(xiàn)Singleton對(duì)象實(shí)例,但容器僅持有該對(duì)象的弱引用(WeakReference),所以該對(duì)象的生存期由外部引用控制。
•PerThreadLifetimeManager - 為每個(gè)線(xiàn)程生成Singleton的對(duì)象實(shí)例,通過(guò)ThreadStatic實(shí)現(xiàn)。
•PerResolveLifetimeManager - 實(shí)現(xiàn)與TransientLifetimeManager類(lèi)似的行為,為每次請(qǐng)求生成新的類(lèi)型對(duì)象實(shí)例。不同之處在于對(duì)象實(shí)例在BuildUp過(guò)程中是可被重用的。
Code Double
代碼如下:
public interface IExample : IDisposable
{
void SayHello();
}
public class Example : IExample
{
private bool _disposed = false;
private readonly Guid _key = Guid.NewGuid();
public void SayHello()
{
if (_disposed)
{
throw new ObjectDisposedException("Example",
新聞熱點(diǎn)
疑難解答
圖片精選