[ExportAttribute] 支援類別、欄位、屬性、方法四種層級的導出,其 AttributeUsage 定義如下:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Field |
AttributeTargets.Property | AttributeTargets.Method,
AllowMultiple = true, Inherited = false)]
public class ExportAttribute : Attribute { ... }
最常見用法,將整個類別標記為可組合部件:
[Export]
public class DBLogger { }
使用契約名稱字串配對:
public partial class MainPage : UserControl
{
[Import("Name")]
public string BookName { get; set; }
public MainPage()
{
InitializeComponent();
CompositionInitializer.SatisfyImports(this);
MessageBox.Show(BookName); // 顯示 "《MEF程式設計指南》"
}
}
public class BookService
{
[Export("Name")]
public string BookName => "《MEF程式設計指南》";
}
利用 Action<T> 委託導出方法:
public class BookService
{
[Export(typeof(Action<string>))]
public void PrintBookName(string name) => Console.WriteLine(name);
}
public partial class MethodExportImport : UserControl
{
[Import(typeof(Action<string>))]
public Action<string> PrintBookName { get; set; }
public MethodExportImport()
{
InitializeComponent();
CompositionInitializer.SatisfyImports(this);
PrintBookName("《MEF程式設計指南》");
}
}
使用 [InheritedExport] 讓介面實作自動成為可導出部件:
[InheritedExport]
public interface IUserServie
{
string GetUserName();
}
public class UserService : IUserServie
{
public string GetUserName() => "張三";
}
public partial class InheritedExportImport : UserControl
{
[Import]
public IUserServie UService { get; set; }
// 自動注入 UserService 實例
}
MEF 亦支援建構函式參數導入,可參考官方文件深入探索。