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

MEF 程式設計指南(四):Export 與 Import 屬性全方位應用

     編輯:關於.NET

[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 亦支援建構函式參數導入,可參考官方文件深入探索。

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