国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

基于Unity容器中的對(duì)象生存期管理分析

2024-07-10 12:45:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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",

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 田东县| 沿河| 贵南县| 根河市| 分宜县| 新乡县| 辽中县| 星子县| 高雄市| 明光市| 东安县| 贡嘎县| 昆明市| 襄汾县| 金溪县| 清远市| 蒲城县| 南通市| 萍乡市| 永城市| 连云港市| 积石山| 文成县| 红桥区| 象州县| 毕节市| 连南| 黑山县| 临朐县| 远安县| 元阳县| 黎城县| 青铜峡市| 大宁县| 英吉沙县| 孙吴县| 藁城市| 鄂伦春自治旗| 万安县| 福贡县| 阜平县|