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

MEF 實戰(五):導出元資料,讓匯入端能篩選、檢視擴充資訊

     編輯:關於C#

MEF(Managed Extensibility Framework)的 Metadata(元資料) 機制,讓匯出端能在 [Export] 時附加額外資訊(版本、作者、優先級…),匯入端透過 Lazy<T, TMetadata> 或強型別介面 IMetadata 讀取,實現「不實例化就能先看屬性、決定要不要載入」的延遲載入與篩選。

預設元資料:型別資訊

即使不手動加 [ExportMetadata],MEF 仍會自動產生包含 ExportTypeIdentity 等鍵值的字典,可透過 ExportDefinition.Metadata 檢視。

手動附加元資料:ExportMetadataAttribute

[Export(typeof(ITask))]
[ExportMetadata("Ver", 200)]
[ExportMetadata("Author", "小王")]
public class MyTask : ITask { /* ... */ }

匯入端讀取:Lazy<T, IDictionary<string,object>>

[Import]
public Lazy<ITask, IDictionary<string, object>> TaskWithMeta { get; set; }

// 使用時
if (TaskWithMeta.Metadata.ContainsKey("Ver")) 
    Console.WriteLine($"版本:{TaskWithMeta.Metadata["Ver"]}");
// TaskWithMeta.Value 才會真正實例化

強型別元資料介面(建議做法)

// 1. 定義介面 + MetadataViewImplementation
[MetadataViewImplementation(typeof(MyTaskMetadata))]
public interface ITaskMetadata {
    int Ver { get; }
    string Author { get; }
}

// 2. 實作類別(必須有 IDictionary 建構子)
public class MyTaskMetadata : ITaskMetadata {
    private readonly IDictionary<string, object> _dic;
    public MyTaskMetadata(IDictionary<string, object> dic) => _dic = dic;
    public int Ver => _dic.TryGetValue("Ver", out var v) ? Convert.ToInt32(v) : -1;
    public string Author => _dic.TryGetValue("Author", out var v) ? v.ToString() : "";
}

// 3. 匯入端改用強型別
[Import]
public Lazy<ITask, ITaskMetadata> TaskStrongMeta { get; set; }

// 使用
Console.WriteLine($"版本:{TaskStrongMeta.Metadata.Ver}, 作者:{TaskStrongMeta.Metadata.Author}");

預設元資料截圖

ExportMetadataAttribute 範例

Lazy 匯入元資料

強型別元資料執行結果

實務應用場景

  • 外掛優先序:[ExportMetadata("Priority", 10)],匯入時排序再載入。
  • 相依版本檢查:載入前比對 Ver,不符合拒絕載入。
  • 授權/授權模式:LicenseType 區分 Trial/Pro,UI 動態顯示功能。
  • 延遲實例化:Lazy<T, TMeta> 只有呼叫 .Value 才建立實例,省資源。

元資料是 MEF 從「單純掃描組件」進化為「智慧型外掛系統」的關鍵。善用強型別介面,讓編譯器幫你把字串鍵值拼錯的低級錯誤擋在編譯期。

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