MEF 基礎簡介 一

来源:https://www.cnblogs.com/SmileIven/archive/2018/08/24/9529239.html
-Advertisement-
Play Games

前言 小編菜鳥級別的程式員最近感慨頗多,經歷了三五春秋深知程式路途遙遠而我滄海一粟看不到的盡頭到不了的終點何處是我停留的驛站。說了段廢話下麵進入正題吧! 什麼是MEF? MEF:全稱Managed Extensibility Framework(托管可擴展框架)。單從名字我們不難發現MEF是專門致力 ...


前言

  小編菜鳥級別的程式員最近感慨頗多,經歷了三五春秋深知程式路途遙遠而我滄海一粟看不到的盡頭到不了的終點何處是我停留的驛站。說了段廢話下麵進入正題吧!

什麼是MEF?

MEF:全稱Managed Extensibility Framework(托管可擴展框架)。單從名字我們不難發現MEF是專門致力於解決擴展性問題的框架。

MSDN:MEF(Managed Extensibility Framework)是一個用於創建可擴展的輕型應用程式的庫。 應用程式開發人員可利用該庫發現並使用擴展,而無需進行配置。 擴展開發人員還可以利用該庫輕鬆地封裝代碼,避免生成脆弱的硬依賴項。 通過 MEF,不僅可以在應用程式內重用擴展,還可以在應用程式之間重用擴展。

也有人把MEF解釋為“依賴註入”的一種方式,那麼什麼是“依賴註入”?

其實依賴註入就是我們日常所說的IOC/DI也就是IOC控制反轉,DI依賴註入這倆是一個概念不同的角度理解的意思,當然了IOC被稱為是一種思想並不是技術的實現而本章講解的MEF屬於IOC的一種大家可以吧IOC看作為一種編程“語言” 在編程語言中有很多的種類例如:C#,JAVA,C++等等。MEF就屬於IOC中的一種,還有很多其他的實現方式大家可以自行百度去找相關素材。

瞭解MEF只需要抓住以下幾個關鍵點:

(1)字面意思,可擴展的framework,或者叫可擴展的庫。也就是說,使用MEF是為了提高程式的可擴展性。MEF會根據指定的導入導出自動去發現匹配的擴展,不需要進行複雜的程式配置。

(2)在設計層面上來說,為什麼要使用MEF?為了“松耦合”!我們知道,程式設計有幾個原則,“高內聚,低耦合”就是其中一個。使用MEF可以幫助我們減少內庫之間的耦合。

MEF用法

(1)MEF基礎導入導出的使用: MEF的使用步驟主要分三步:宿主MEF並組合部件、標記對象的導出、對象的導入使用。

 IBookService內容如下:

    public interface IBookService
    {
        string BookName { get; set; }
        string GetBookName();
    }

建立MusicBook繼承自IBookService

    [Export(typeof(IBookService))]
    public class MusicBook : IBookService
    {
        public string BookName { get; set; }

        public string GetBookName()
        {
            return "jhtBOOK";
        }
    }

建立測試類使用[Import]導入剛剛導出的MusicBook,下麵的Compose方法,實例化CompositionContainer來實現組合,需引用:

class Program
{
    [Import]
    public IBookService Service { get; set; }

    static void Main(string[] args)
    {
        Program pro = new Program();
        pro.Compose();
        if (pro.Service != null)
        {
            Console.WriteLine(pro.Service.GetBookName());
        }
        Console.Read();
    }

    private void Compose()
    {
        //宿主MEF並組合部件
        var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
        CompositionContainer container = new CompositionContainer(catalog);
        //將部件(part)和宿主程式添加到組合容器
        container.ComposeParts(this);
    }
}

測試結果展現:

Composr:這個方法表示把當前Program這個類添加到組合容器,為什麼要添加到組合容器?是因為只要添加到組合容器中之後,如果該類裡面有Import,MEF才會自動去尋找對應的Export。這也就是為什麼使用MEF前必須要組合部件的原因。大家也就可以吧IOC容器理解為一個鍵值對存在的集合初始化之後需要用到的對象自動到IOC容器中去尋找。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一次發佈MVC項目,打開網站 未能載入文件或程式集“System.Web.Http.WebHost, Version=4.0.0.0, ”或它的某一個依賴項。系統找不到指定的文件。 問題原因:缺少配置文件(System.Net.Http.Formatting.dll,System.Web.Http ...
  • 一、要做成什麼樣 bs端的輪播控制項千千萬,有的甚至能作為一個單獨的庫來開發,所涉及到的功能也是繽紛多彩。相對來說,cs端的輪播用得不多,我這裡只是簡單的做了個能滿足一般需求的輪播,在項目中湊會湊會還是可以的。先給兩張圖,看看最後的效果: 如圖,整個結構就是左右箭頭、底部小點以及內同三大部分。雖然是簡 ...
  • 2018-08-24 c#金額轉換成中文大寫金額 decimal PriceSum = 32957.2654; 調用 var PriceSumChinese = MoneyToUpper(PriceSum.ToString()); 結果:叄萬貳仟玖佰伍拾柒圓貳角柒分 ...
  • 前言 List集合操作去除重覆數據的這種情況經常會碰到,博客園裡面也有很多大神們做過,在這裡主要是借鑒然後自己整理了一下,主要是為了方便自己,以後再次碰到這種去重問題,直接打開自己的鏈接拿起鍵盤就是乾,,,, 一、方法一 利用HashSet去重,在實體類里重寫Equals和GetHashCode方法 ...
  • 前言 前面講解了MEF的引用方法,介面的導入導出,類屬性的導入導出和集合的導出用法其實大家可以看到基本上大同小異的。 MEF的延遲載入 我們知道當裝配一個組件的時候,當前組件裡面的所有的Import的變數都自動去找到對應的Export而執行了實例化,有些時候出於程式效率的考慮,不需要立即實例化對象, ...
  • MEF導出類的方法和屬性 首先來說導出屬性,因為這個比較簡單,和導出類差不多,先來看看代碼,主要看我加註釋的地方,MusicBook.cs中的代碼如下: program.cs中的代碼如下: 下麵還用foreach遍歷輸出屬性的值,運行即可查看到結果。最後我會附上源碼供大家下載,這裡就不再截圖了。 下 ...
  • C 5.0 推出async和await,最早是.NET Framework 4.5引入,可以在Visual Studio 2012使用。在此之前的非同步編程實現難度較高,async使非同步編程的實現變得簡便。 各平臺對async的支持情況 |平臺|async| | | | |.NET 4.5及以上|& ...
  • 代碼: private static ImageCodecInfo GetImageCodecInfo(ImageFormat imageFormat) { ImageCodecInfo[] imageCodecInfoArr = ImageCodecInfo.GetImageDecoders(); ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...