
- .NET Core 教程
- .NET Core - 首頁
- .NET Core - 概述
- .NET Core - 先決條件
- .NET Core - 環境設定
- .NET Core - 入門
- .NET Core - 數值計算
- .NET Core - 垃圾回收
- .NET Core - 程式碼執行
- .NET Core - 模組化
- .NET Core - 專案檔案
- .NET Core - 包引用
- 使用 .NET Core 建立 UWP 應用
- .NET Core - MSBuild
- .NET Core - 元包
- Windows 執行時和擴充套件 SDK
- 建立 .NET Standard 庫
- .NET Core - 可移植類庫
- 向庫新增引用
- 共享 .NET Core 庫
- 建立 Xamarin.Forms 專案
- .NET Core - PCL 故障排除
- .NET Core - 建立測試專案
- 在 Visual Studio 中執行測試
- .NET Core - 測試庫
- 託管可擴充套件性框架
- .NET Core - SDK
- .NET Core - MSBuild 和 project.json
- 還原和構建以及 MSBuild
- .NET Core - 遷移
- .NET Core 有用資源
- .NET Core - 快速指南
- .NET Core - 有用資源
- .NET Core - 討論
託管可擴充套件性框架
本章將討論託管可擴充套件性框架 (MEF)。MEF 可用於第三方外掛擴充套件,也可以為常規應用程式帶來鬆散耦合外掛式架構的優勢。
MEF 是一個用於建立輕量級、可擴充套件應用程式的庫。
它允許應用程式開發人員發現和使用擴充套件,無需任何配置。
MEF 是 .NET Framework 4 的一個組成部分,並且可在使用 .NET Framework 的任何地方使用,從而提高大型應用程式的靈活性和可維護性以及可測試性。
您可以在客戶端應用程式中使用 MEF,無論它們使用的是 Windows 窗體、WPF 還是任何其他技術,或者在使用 ASP.NET 的伺服器應用程式中使用。
MEF 也已作為 **Microsoft.Composition** 移植到 .NET Core,但只是部分移植。
只有 **System.Composition** 被移植,而 **System.ComponentModel.Composition** 尚未可用。這意味著我們沒有可以從目錄中的程式集載入型別的目錄。
本章我們只學習如何在 .NET Core 應用程式中使用 MEF。
讓我們理解一個簡單的例子,在這個例子中,我們將在 .NET Core 控制檯應用程式中使用 MEF。現在讓我們建立一個新的 .NET Core 控制檯專案。
在左側窗格中,選擇 **模板 → Visual C# → .NET** Core,然後在中間窗格中選擇控制檯應用程式 (.NET Core)。
在“名稱”欄位中輸入專案的名稱,然後單擊“確定”。

專案建立後,我們需要新增 Microsoft.Composition 的引用,以便我們可以使用 MEF。為此,讓我們右鍵單擊解決方案資源管理器中的專案,然後選擇 **管理 NuGet 包…**
搜尋 **Microsoft.Composition** 並單擊 **安裝**。

單擊 **確定** 按鈕。

單擊 **我接受** 按鈕。

安裝完成後,您會在引用中發現一個錯誤。

讓我們開啟 **project.json** 檔案。
{ "version": "1.0.0-*", "buildOptions": { "emitEntryPoint": true }, "dependencies": { "Microsoft.Composition": "1.0.30", "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.1" } }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } } }
您可以看到已新增 **Microsoft.Composition** 依賴項,但問題是此包與 **dnxcore50** 不相容。因此,我們需要匯入 **portablenet45+win8+wp8+wpa81**。現在讓我們用以下程式碼替換您的 **project.json** 檔案。
{ "version": "1.0.0-*", "buildOptions": { "emitEntryPoint": true }, "dependencies": { "Microsoft.Composition": "1.0.30", "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.1" } }, "frameworks": { "netcoreapp1.0": { "imports": "portable-net45+win8+wp8+wpa81" } } }
儲存此檔案,您將看到錯誤已更正。

如果展開“引用”,您將看到 **Microsoft.Composition** 的引用。

首先,我們需要建立一個要匯出的介面,並實現該介面,並使用匯出屬性裝飾該類。現在讓我們新增一個新類。
在“名稱”欄位中輸入類的名稱,然後單擊 **新增**。

讓我們在 **PrintData.cs** 檔案中新增以下程式碼。
using System; using System.Collections.Generic; using System.Composition; using System.Linq; using System.Threading.Tasks; namespace MEFDemo { public interface IPrintData { void Send(string message); } [Export(typeof(IPrintData))] public class PrintData : IPrintData { public void Send(string message) { Console.WriteLine(message); } } }
如上所述,Microsoft.Composition 名稱空間中沒有目錄。因此,它將載入程式集中所有帶有匯出屬性的型別,並像 Program.cs 檔案中的 Compose 方法中所示那樣附加到匯入屬性。
using System; using System.Collections.Generic; using System.Composition; using System.Composition.Hosting; using System.Linq; using System.Reflection; using System.Threading.Tasks; namespace MEFDemo { public class Program { public static void Main(string[] args) { Program p = new Program(); p.Run(); } public void Run() { Compose(); PrintData.Send("Hello,this is MEF demo"); } [Import] public IPrintData PrintData { get; set; } private void Compose() { var assemblies = new[] { typeof(Program).GetTypeInfo().Assembly }; var configuration = new ContainerConfiguration() .WithAssembly(typeof(Program).GetTypeInfo().Assembly); using (var container = configuration.CreateContainer()) { PrintData = container.GetExport<IPrintData>(); } } } }
現在讓我們執行您的應用程式,您將看到它透過例項化 **PrintData** 類來執行。

要了解更多關於 MEF 的資訊,請訪問以下網址 https://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx 獲取更多詳細資訊。