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

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

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

      MEF程序設計指南五:遲延(Lazy)加載導出部件(Export Part)與元數據(Metadata)

        MEF中使用導出與導入,實質上就是對一個對象的實例化的過程,通過MEF的特性降低了對象的直接依賴,從而讓系統的設計達到一種高靈活、高擴展性的效果。在具體的設計開發中,存在著某些對象是不需要在系統運行或者的附屬對象初始化的時候進行實例化的,僅僅只需要在需要使用到他的時候才會進行實例化,從系統的上來說這也是提高系統性能的一種可行的實現方式,這種方式就可以理解為對象的遲延初始化,或者叫遲延加載。MEF也對此使用場景提供了完善的實現機制,下面來看看在MEF中的遲延初始化是如何使用的。

      namespace MEFTraining.LzayImports
      {
          
      public interface ILogger
          {
              
      void WriteLog(string message);
          }

          [Export(
      typeof(ILogger))]
          
      public class DBLogger : ILogger
          {
              
      public void WriteLog(string message)
              {
                  MessageBox.Show(message);
              }
          }
      }

       

        通過使用前幾篇博文中使用的日志組件為例,在日志記錄的具體實現對象上進行對象的導出[Export]配置。如果是使用傳統的方式進行部件的導入則如下代碼塊所示:

      [Import(typeof(ILogger))]
      public ILogger Logger { getset; }

       

        如果需要進行遲延(Lazy)加載,MEF專門提供了用于遲延加載的方式,既使用Lazy類來完成遲延加載,然后通過其他屬性Value獲取到所加載到的對象。詳細的使用如下代碼塊:

      public partial class MainPage : UserControl
      {
          
      //傳統加載
          [Import(typeof(ILogger))]
          
      public ILogger Logger { getset; }
          
          
      //遲延加載
          [Import]
          
      public Lazy<ILogger> Service;

          
      public MainPage()
          {
              InitializeComponent();

              CompositionInitializer.SatisfyImports(
      this);

              Logger.WriteLog(
      "日志內容");

              Service.Value.WriteLog(
      "日志內容");
          }
      }

       

        通過調試輸出可以得到使用遲延導入的對象的詳細信息,下面是通過在命令窗口中輸出的Service和Service.Value的詳細信息。

      Service
      ThreadSafetyMode
      =PublicationOnly, IsValueCreated=true, IsValueFaulted=false, Value={MEFTraining.LzayImports.DBLogger}
          IsValueCreated: 
      true
      Service.Value
      {MEFTraining.LzayImports.DBLogger}
          [MEFTraining.LzayImports.DBLogger]: {MEFTraining.LzayImports.DBLogger}

       

         遲延加載還支持元數據的導出和導入,主要使用[MetadataAttribute]特性實現,實際開發中可以進行自定義元數據結構,這里以一個空的元數據接口進行元數據的導入應用演示。

      public interface IMetadata
      {
            
      }

       

        在導出部件中就可以使用元數據特性進行聲明,如下簡單的應用。

      [MetadataAttribute]
      [Export(
      typeof(Users))]
      public class Users
      {
          
      public string UserName = "張三";
      }

       

        元數據的導入應用如下代碼塊所示:

      public partial class MetadataControl : UserControl
      {
          [Import(
      typeof(Users))]
          
      public Lazy<Users,IMetadata> Users { getset; }

          
      public MetadataControl()
          {
              InitializeComponent();

              
      //宿主MEF托管擴展容器
              CompositionInitializer.SatisfyImports(this);

              MessageBox.Show(Users.Value.UserName);
          }
      }

       

        對于的調試輸出為下面代碼塊所示:

      Users
      ThreadSafetyMode
      =PublicationOnly, IsValueCreated=true, IsValueFaulted=falseValue={MEFTraining.LzayImports.Users}
          
      base {System.Lazy<MEFTraining.LzayImports.Users>}: ThreadSafetyMode=PublicationOnly, IsValueCreated=true, IsValueFaulted=false, Value={MEFTraining.LzayImports.Users}
          Metadata: {_proxy_MEFTraining.LzayImports.IMetadata_0174a468
      -9771-4271-a37e-9a4a83eca6bd}

       

        MEF中也提供了專門用于元數據導入、導出的特性[ExportMetadata],使用ExportMetadata基本可以滿足大部分元數據的導出、導入支持。通過修改上面的示例來實現自定義元數據結構的導入、導出應用演示。

      public interface IMetadata
      {
          
      string Name { get; }
      }

      [ExportMetadata(
      "Name","李四")]
      [Export(
      typeof(Users))]
      public class Users
      {
          
      public string UserName = "張三";
      }

       

        上面的示例代碼演示了通過元數據導出屬性名為“Name”,其值為“李四”的元數據信息,并且還定義了一個用于承載元數據結構的結構,接下來就可以通過遲延加載導入,進行元數據的獲取了。

      public partial class MetadataControl : UserControl
      {
          [Import(
      typeof(Users))]
          
      public Lazy<Users,IMetadata> Users { getset; }

          
      public MetadataControl()
          {
              InitializeComponent();

              
      //宿主MEF托管擴展容器
              CompositionInitializer.SatisfyImports(this);

              MessageBox.Show(Users.Value.UserName);
          }
      }

       

        下圖為允許調試中的截圖,可以很清楚的看到,在進行遲延導入的時候已經將導出部件中的元數據信息成功的導入到了當前對象實例屬性中。

          

       

        下面是完整的元數據應用實例代碼。

      namespace MEFTraining.LzayImports
      {
          
      public partial class MetadataControl : UserControl
          {
              [Import(
      typeof(Users))]
              
      public Lazy<Users,IMetadata> Users { getset; }

              
      public MetadataControl()
              {
                  InitializeComponent();

                  
      //宿主MEF托管擴展容器
                  CompositionInitializer.SatisfyImports(this);

                  MessageBox.Show(Users.Value.UserName);
              }
          }

          
      public interface IMetadata
          {
              
      string Name { get; }
          }

          [ExportMetadata(
      "Name","李四")]
          [Export(
      typeof(Users))]
          
      public class Users
          {
              
      public string UserName = "張三";
          }
      }

       

         除此之外,遲延加載也是支持弱類型的元數據類型的,也可以對元數據進行過濾,這里就不做詳細的介紹,有興趣的朋友可以自己去研究研究。

       

        

       

        本篇參考:Lazy Imports  、Exports and Metadata  

        MEF官方網站:http://mef.codeplex.com/

        推薦指南:MEF程序設計指南一:在應用程序中宿主MEF

               MEF程序設計指南二:Silverlight中使用CompositionInitializer宿主MEF

               MEF程序設計指南三:MEF中組合部件(Composable Parts)與契約(Contracts)的基本應用

             MEF程序設計指南四:使用MEF聲明導出(Exports)與導入(Imports)

       

      相關說明

       本文屬學習筆記文章,愿與有志者共同學習交流。歡迎轉載,但請在明顯地位標記本文的原文連接。  

      作      者:Beniao

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

       

      posted on 2010-07-14 22:54  Bēniaǒ  閱讀(12314)  評論(6)    收藏  舉報

      主站蜘蛛池模板: 四虎av永久在线精品免费观看| 蜜臀av在线一区二区三区| 亚洲免费成人av一区| 欧美日韩精品一区二区视频| 狠狠色噜噜狠狠狠777米奇小说| 日日躁夜夜躁狠狠躁超碰97| 欧美在线观看www| free性开放小少妇| 日本久久一区二区免高清| 人妻av一区二区三区av免费| 久久婷婷综合色丁香五月| 成人一区二区人妻不卡视频| 激情欧美日韩一区二区| 99麻豆久久精品一区二区| 国产精品自在拍首页视频8 | 国语对白做受xxxxx在线中国| 麻豆国产97在线 | 欧美| 亚洲高清WWW色好看美女| 亚洲色精品vr一区区三区| 丝袜无码一区二区三区| 日本午夜精品一区二区三区电影| 少妇人妻无码专区视频| 国产精品伦人一久二久三久| 久久精品国产福利一区二区 | 亚洲av无码精品色午夜蛋壳| 精品一区二区三区无码视频| 成人午夜无人区一区二区| 国产成人啪精品午夜网站| 揭西县| 亚洲精品一区二区三区小| 日本大片免A费观看视频三区| 久久精品国产99久久久古代 | 中文字幕一区二区网站| 強壮公弄得我次次高潮A片| 亚洲韩国精品无码一区二区三区| 国产成AV人片久青草影院| 久久99国产亚洲高清观看首页 | 91麻豆视频国产一区二区| 国产区成人精品视频| 日韩精品 在线 国产 丝袜| 一区二区三区激情都市|