<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      MEF程序設(shè)計(jì)指南八:部件生命周期(Parts Lifetime)托管

        MEF中的每一個(gè)可進(jìn)行動(dòng)態(tài)裝配的導(dǎo)出部件都是具有生命周期的,在沒有特別需求的情況下一般都沒有對(duì)生命周期進(jìn)行管理,而實(shí)際上MEF已為每一個(gè)部件進(jìn)行了默認(rèn)的生命周期管理,MEF的生命周期分為三種:Any、Shared及NonShared,被定義在System.ComponentModel.Composition.CreationPolicy枚舉對(duì)象中。
      namespace System.ComponentModel.Composition
      {
          
      public enum CreationPolicy
          {
               Any 
      = 0,
               Shared 
      = 1,
               NonShared 
      = 2,
          }
      }

       

        Any表示可共享或不共享,部件的實(shí)例用MEF容器根據(jù)不同的請(qǐng)求需求自動(dòng)控制;Shared表示共享部件,既Shared類型的插件部件可以在多個(gè)MEF組合容器中共用;其次是NonShared類型,表示不共享部件實(shí)例,每當(dāng)有新的請(qǐng)求就會(huì)創(chuàng)建一個(gè)新的對(duì)象實(shí)例。在MEF中,通過PartCreationPolicyAttribute特性實(shí)現(xiàn)對(duì)部件的生命周期配置。

      public interface IBookService
      {
          
      string GetBookName();
      }

      [PartCreationPolicy(CreationPolicy.Any)]
      [Export(
      typeof(IBookService))]
      public class MEFBookService : IBookService
      {
          
      public string GetBookName()
          {
              
      return "《MEF程序設(shè)計(jì)指南》";
          }
      }

      [PartCreationPolicy(CreationPolicy.NonShared)]
      [Export(
      typeof(IBookService))]
      public class ASPNETBookService : IBookService
      {
          
      public string GetBookName()
          {
              
      return "《ASP.NET項(xiàng)目案例》";
          }
      }

      [PartCreationPolicy(CreationPolicy.Shared)]
      [Export(
      typeof(IBookService))]
      public class SLBookService : IBookService
      {
          
      public string GetBookName()
          {
              
      return "《Silverlight高級(jí)編程》";
          }
      }

       

         如上示例代碼分別演示了使用Any、Shared及NonShared類型的生命周期托管類型對(duì)不同的對(duì)象進(jìn)行導(dǎo)出部件配置。接下來通過導(dǎo)入部件并加入生命周期托管篩選,詳細(xì)應(yīng)用如下代碼塊所示:

      public partial class MainPage : UserControl
      {
          [ImportMany(RequiredCreationPolicy 
      = CreationPolicy.Shared)]
          
      public List<IBookService> Service { getset; }

          
      public MainPage()
          {
              InitializeComponent();

              CompositionInitializer.SatisfyImports(
      this);
              
      //得到成功裝配的部件總數(shù)為2,因?yàn)锳ny類型是可以共存于多個(gè)MEF容器的。
              int count = Service.Count;
          }
      }

       

        表面上看去和上一篇指南中介紹的部件的篩選過濾功能非常相似,不同是的過濾篩選是通過自定義篩選策略實(shí)現(xiàn),而這里是通過MEF生命周期范圍托管來實(shí)現(xiàn)的。在實(shí)際的項(xiàng)目開發(fā)中需根據(jù)不同的應(yīng)用場(chǎng)景確定具體的技術(shù)實(shí)現(xiàn)方案。

       

        除了容器部件的生命周期托管,我們也得考慮部件容器自身的生命周期,容器什么時(shí)候釋放資源,時(shí)候時(shí)候釋放其內(nèi)部部件的資源占用等。為了提高系統(tǒng)的整體性能,MEF建議將每一個(gè)可導(dǎo)入部件實(shí)現(xiàn)IDisposable 接口,用于資源的占用處理,如果部件從MEF容器中移除那么所對(duì)應(yīng)占用的資源也會(huì)自動(dòng)的清理。這里需要注意一點(diǎn),就是當(dāng)組合容器被釋放掉后遲延加載的操作就不能再繼續(xù)工作了,會(huì)拋出System.ObjectDisposedException異常。

       

            

        如上圖所示,MEF的容器是具有層次結(jié)構(gòu)的,最高層級(jí)容器為程序直接應(yīng)用級(jí)容器,可以通過以下的代碼獲取到。

       

      var catalog = new AssemblyCatalog(typeof(MainPage).Assembly);
      var container 
      = new CompositionContainer(catalog);

       

       

        位于頂級(jí)容器之下的子容器,通常來說都是控制著一些可動(dòng)態(tài)裝配的部件對(duì)象,如同上一篇指南中介紹到使用過濾器篩選部件的應(yīng)用案例,通過過濾表達(dá)式從頂級(jí)容器中進(jìn)行篩選,得出了新的MEF容器child,child托管著根據(jù)條件過濾篩選出來的所有結(jié)果部件對(duì)象。詳細(xì)代碼如下:

      //獲取當(dāng)前應(yīng)用程序目錄
      var catalog = new AssemblyCatalog(typeof(MainPage).Assembly);
      //將目錄裝載進(jìn)MEF組合容器
      var parent = new CompositionContainer(catalog);
      //通過元數(shù)據(jù)過濾篩選出元數(shù)據(jù)名稱為"UC"值為"CC"的組合部件
      var filteredCat = new FilteredCatalog(catalog,
          def 
      => def.Metadata.ContainsKey("UC"&&
          def.Metadata[
      "UC"].ToString() == "CC");
      var child 
      = new CompositionContainer(filteredCat, parent);
      var control 
      = child.GetExportedValue<UserControl>();

       

       

      MEF官方網(wǎng)站:http://mef.codeplex.com/

        推薦指南:MEF程序設(shè)計(jì)指南一:在應(yīng)用程序中宿主MEF

               MEF程序設(shè)計(jì)指南二:Silverlight中使用CompositionInitializer宿主MEF

               MEF程序設(shè)計(jì)指南三:MEF中組合部件(Composable Parts)與契約(Contracts)的基本應(yīng)用

             MEF程序設(shè)計(jì)指南四:使用MEF聲明導(dǎo)出(Exports)與導(dǎo)入(Imports)

                  MEF程序設(shè)計(jì)指南五:遲延(Lazy)加載導(dǎo)出部件(Export Part)與元數(shù)據(jù)(Metadata)

              MEF程序設(shè)計(jì)指南六:MEF中的目錄服務(wù)(DeploymentCatalog)

                         MEF程序設(shè)計(jì)指南七:使用目錄(Catalog)動(dòng)態(tài)裝載xap與目錄篩選(Filtered Catalog)

       

      相關(guān)說明

       本文屬學(xué)習(xí)筆記文章,愿與有志者共同學(xué)習(xí)交流。歡迎轉(zhuǎn)載,但請(qǐng)?jiān)诿黠@地位標(biāo)記本文的原文連接。  

      作      者:Beniao

      文章出處:http://beniao.cnblogs.com/  或  http://www.rzrgm.cn/

       

      posted on 2010-07-28 23:14  Bēniaǒ  閱讀(7752)  評(píng)論(1)    收藏  舉報(bào)

      主站蜘蛛池模板: 人人澡人摸人人添| 正在播放酒店约少妇高潮| 亚洲av色香蕉一区二区三区精品| 国产精品天堂蜜av在线播放| 久久精品99国产国产精| 亚洲区欧美区综合区自拍区| 97久久精品午夜一区二区| 十八禁国产精品一区二区| 无码人妻丝袜在线视频| 国产精品无码av不卡| 临江市| 国产AV永久无码青青草原| 久久精品国产亚洲综合av| 少妇粗大进出白浆嘿嘿视频| 精品人妻午夜一区二区三区四区| 深夜免费av在线观看| 成年站免费网站看v片在线| 国产日韩精品中文字幕| 综合久久国产九一剧情麻豆| 丰满熟妇人妻中文字幕| 97久久综合亚洲色hezyo| 丁香婷婷综合激情五月色| 久久久久成人精品无码中文字幕| 国产午夜在线观看视频播放| 人妻少妇精品视频专区| 高清免费毛片| 免费看欧美全黄成人片| 精品综合一区二区三区四区| 国产精品成人一区二区不卡| 给我中国免费播放片在线| 丰都县| 精品综合一区二区三区四区| 欧洲免费一区二区三区视频| 99RE6在线观看国产精品| 动漫av网站免费观看| 一道本AV免费不卡播放| 国产精品中文第一字幕| 国产麻豆剧传媒精品国产av| 欧美成人aaa片一区国产精品| 亚洲精品乱码久久观看网| 色综合亚洲一区二区小说|