首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

MEF 程式設計指南(五):Lazy 延遲載入與中繼資料應用

     編輯:關於.NET

MEF 的導出/導入本質是物件實例化過程,透過屬性降低直接相依。實務上,某些物件不需在啟動時建立,僅在實際使用時才實例化,這就是延遲初始化,能有效提升效能。MEF 內建 Lazy<T> 支援此場景。

基本延遲載入

定義介面與實作:

public interface ILogger
{
    void WriteLog(string message);
}

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

傳統導入會立即建立實例:

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

改用 Lazy<T> 延遲載入:

public partial class MainPage : UserControl
{
    [Import(typeof(ILogger))]
    public ILogger Logger { get; set; } // 傳統

    [Import]
    public Lazy<ILogger> Service { get; set; } // 延遲

    public MainPage()
    {
        InitializeComponent();
        CompositionInitializer.SatisfyImports(this);
        Logger.WriteLog("日誌內容");       // 立即使用
        Service.Value.WriteLog("日誌內容"); // 首次存取 Value 時才建立實例
    }
}

除錯輸出可見 IsValueCreated 等狀態,確認實例確實在首次存取時才建立。

延遲載入搭配中繼資料

MEF 支援在延遲載入時攜帶中繼資料。首先定義中繼資料介面:

public interface IMetadata
{
    string Name { get; }
}

導出端使用 [ExportMetadata] 標記:

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

導入端以 Lazy<T, TMetadata> 接收:

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

    public MetadataControl()
    {
        InitializeComponent();
        CompositionInitializer.SatisfyImports(this);
        MessageBox.Show(Users.Value.UserName); // 取得實例
        // Users.Metadata.Name 可取得 "李四"
    }
}
延遲載入中繼資料除錯視圖

完整範例程式碼已包含於文章中。此外,MEF 也支援弱型別中繼資料與中繼資料篩選,進一步增強彈性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved