MEF 導入(Import)和導出(Export)

前言:

MEF不同于其他IOC容器(如:Castle)很重要的原因在于它使用了特性化編程模型(涉及到兩個概念:“特性”和“編程模型”)。

特性(Attribute):舉例來說就是我們在開發過程中在類上標記的如:[Serializable]的標簽。

編程模型(Programming Model):MEF中的編程模型是定義 MEF 所操作的概念性對象集的特定方法。MEF默認使用特性化編程模型,但是用戶也可自定義編程模型。MEF中導入、導出間的匹配均是通過特性來實現的。本文簡單的介紹下MEF中得導入和導出。

導入和導出基礎:

在上一篇文章中我們說過導出提供服務,而導入是使用服務。導入使用 Import特性聲明 ,導出使用 Export 特性聲明。 Export 特性可修飾類、字段、屬性或方法,而 Import 特性可修飾字段、屬性或構造函數參數。導入和導出的匹配必須要有相同的Contract,Contract有兩部分組成:ContractName(名稱)和ContractType(類型),只有名稱和類型都完全相同,才會認為導出能夠滿足特定導入。如:

View Code ?1 public interface ILog 2 { 3????? void Log(Exception ex); 4 } 5 6 //導出的類型為ILog[Export(typeof(ILog))] 7 pulic class FileLog:ILog 8 { 9????? public void Log(Exception ex) 10????? { 11????? } 12 } 13 14 pulic class MyClass 15 { 16???????? //導入的類型默認為ILog,可以與導出匹配??? [Import] 17???? pulic Ilog MyLog 18???? { 19???????? get; 20???????? set; 21???? } 22 }

導入的類型:

MEF中導入的類型包括了:動態導入、延遲導入、必備導入和可選導入。

動態導入:使用dynamic關鍵字進行導入,協定類型從 dynamic 關鍵字推斷而出,則它將與任何協定類型匹配。所以在使用倒臺導入時必須指定協定名稱,否則將未匹配任何導出

1 public class MyClass 2 { 3???? [Import(“MyLog”)] 4???? public dynamic MyLog{ get; set; } 5 }

延遲導入:我們知道延遲加載,那么延遲導入同延遲加載的作用一樣:導入和導出匹配時不會立即實例化對象,延遲導入需要使用Lazy<T>來聲明導入:

1 public class MyClass 2 { 3???? [Import] 4???? public Lazy<ILog> MyLog { get; set; } 5 }

?

必備導入:在我們的日常工作中我們可能經常會用到依賴注入,依賴注入有一種方式便是通過構造函數將我們需要的對象注入到本類中,MEF也可以完成相同的工作。

??? 導出的 MEF 部件通常由組合引擎創建,默認情況下,在創建部件時,組合引擎將使用無參數的構造函數。要想使用自定義構造函數需要使用特性:ImportingConstructor。使用必備導入時必須同時提供默認構造和ImportingConstructor的構造方法,否則將出錯.MEF允許導入和導出的循環依賴。

?1 public class MyClass 2 { 3???? private ILog _myLog; 4 5???? public MyClass() { } 6 7???? [ImportingConstructor] 8???? public MyClass(ILog myLog) 9???? { 10???????? _myLog = myLog; 11???? } 12 }

?

可選導入:在MEF中如果導入得不到匹配將會組合失敗,但我們需要容錯時,使用AllowDefault 屬性指定導入為可選:[Import(AllowDefault = true)]。這樣即使導入沒有得到匹配也不會影響組合容器對部件的組合。

導入多個對象:導入和導出可以支持一對多的關系,使用ImportMany特性可以導入多個服務(導出),使用ImportMany標記的導入始終是可選導入。

1 public class MyClass 2 { 3???? [ImportMany] 4???? public IEnumerable<ILog> MyLogs { get; set; } 5 }

導入和導出的繼承

導入的繼承:導入始終由子類繼承,子類擁有和父類相同的導入。

導出的繼承:使用Export特性的導出部件始終不能唄繼承,如果想要導出部件可以被繼承需要使用關鍵字:InheritedExport,子類將提供與父類相同的導出(包括ContractName和ContractType)。但是InheritedExport只能標記在類上,也就是說成員導出永遠不能被繼承。

后記:導入和導出相關的概念還包括元數據,以及自定義導出相關知識,將在下一篇中詳細介紹。

本文參考:http://msdn.microsoft.com/zh-cn/library/ee155691.aspx#MtViewDropDownText

?

作者:ps_zw

出處:http://www.cnblogs.com/pszw/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.

轉載于:https://www.cnblogs.com/zjoch/p/3652789.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258768.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258768.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258768.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android SimpleAdapter的參數

1.作用是ArrayList和 ListView的橋梁。這個ArrayList里邊的每一項都是一個Map<String,?>類型。 ArrayList當中的每一項 Map對象都和ListView里邊的每一項進行數據綁定一一對應。2.SimpleAdapter的構造函數&#xff1a;SimpleAdapter(Context context, List<? …

JMeter 教程匯總鏈接

http://www.360doc.com/content/14/0318/23/16361380_361732630.shtml 可以作為入門系列教程。 盡管網頁也給出了視頻鏈接&#xff0c;但是我不建議看視頻學習&#xff01; 建議直接看文字&#xff08;可以跳躍式學習&#xff0c;視頻的則是線性學習&#xff09;轉載于:https:…

C++ STL中set底層實現方式

Q&#xff1a;STL中set底層實現方式&#xff1f; 為什么不用hash&#xff1f; A: 第一個問題:set底層實現方式為RB樹&#xff08;即紅黑樹&#xff09;。 第二個問題: 首先set&#xff0c;不像map那樣是key-value對&#xff0c;它的key與value是相同的。關于set有兩種說法&…

python自動獲取天氣_用python獲取天氣數據,并作定時播報

原標題&#xff1a;用python獲取天氣數據&#xff0c;并作定時播報數據挖掘入門與實戰 公眾號&#xff1a; datadw思路1.調用和風天氣的API&#xff0c;獲取天氣數據2.用百度語音API&#xff0c;將天氣數據合成語音3.用樹莓派每天早上定時播報天氣(定時任務crontab Python腳本…

c++實現解析文件路徑

注意&#xff1a;本實現只能解析類似linux下的路徑&#xff0c;即“/data/a.txt”&#xff0c;而不能解析“c:\a.txt” 或者“c:\\a.txt”&#xff0c;但是應該很容易擴展改寫實現此功能。 FilepathParse.h #include <string> using std::string;void parseFilepath(str…

gedit搭建c開發環境

在管理外部工具中&#xff0c;創建啟動腳本 1 #!/bin/sh 2 DIR$GEDIT_CURRENT_DOCUMENT_DIR 3 NAME$GEDIT_CURRENT_DOCUMENT_NAME 4 /home/lxy/code/c/struct/run.sh ${DIR}/${NAME} 創建run.sh #!/bin/sh file$1 ext${file##*.}#C if [ $ext "c" ]; thenif [ -f $f…

Oracle數據庫入門——常用的數據字典

一、oracle數據字典主要由以下幾種視圖構成&#xff1a;1.user視圖以user_為前綴&#xff0c;用來記錄用戶對象的信息 2.all視圖以all_為前綴&#xff0c;用來記錄用戶對象的信息及被授權訪問的對象信息 3.dba視圖以dba_為前綴&#xff0c;用來記錄數據庫實例的所有對象的信息 …

一個excel文檔里復制黏貼另外表單跟著變動_利用Excel連接Power BI,實現PPT報告自動輸出...

?文/HALI就職于汽車行業戰略部門 專注汽車市場信息情報收集和分析因為工作需要&#xff0c;每月周期性的更新數據和撰寫PPT 報告成為繁重的勞動。結果是很多時間花費在數據處理上&#xff0c;真正的分析工作&#xff0c;往往只能草草收場。不能坐以待斃&#xff0c;就要想想有…

出現23.97幀率的原因

http://raytao.lofter.com/post/3d177_185a386 關于那些“格&#xff08;Frame&#xff09;”不得不說的事 今天早上&#xff0c;鄙人在社交網絡發了這一系列的問題&#xff1a;請解釋以下名詞之間的關系或差異。幀&#xff0c;格&#xff0c;幀率&#xff0c;時基&#xff0c;…

8-3建立蒙版

http://www.missyuan.com/thread-527018-1-1.html 在實際操作中&#xff0c;99.9%的蒙版都是通過選區建立的 所以選區要選好 點擊圖層調板下方的按鈕直接建立蒙版(下左圖紅色箭頭處)&#xff0c;效果等同于【圖層_圖層蒙版_顯示選區】 圖層中有了兩個對象&#xff1a;一是圖層&…

今天試了一下iscroll

感覺5和4差別還是有一點的&#xff0c;雖然不是很多&#xff0c;今天用了一下&#xff0c;感覺還是很不錯。 今天看到有人提問說如果頁面要引入多個iscroll怎么弄的問題&#xff0c;其實很簡單&#xff0c;頁面再多實例化一次就可以了。 如&#xff1a; myScroll new iScroll(…

使用ajax將數據顯示在指定位置_AJAX學習主題之一

學習主題&#xff1a;AJAX刪除用戶功能實現根據視頻中的講解&#xff0c;完成以下內容簡述刪除功能的基本思路流程點擊按鈕獲取當前元素中的用戶uid&#xff0c;向服務器發起請求&#xff0c;將uid提交到服務器刪除指定用戶&#xff0c;瀏覽器獲取瀏覽器響應結果。獨立完成刪除…

matlab 配置mex 識別vs2015

問題&#xff1a;先安裝了matlab&#xff0c;后裝了vs13和vs15,但是mex -setup時卻不能識別vs15&#xff0c;采用了兩種辦法&#xff0c;最終得以識別。解決方案&#xff1a;先采用方法&#xff1a; http://blog.csdn.net/yc461515457/article/details/51635842 &#xff0c;但…

互聯網企業安全高級指南3.6 需要自己發明安全機制嗎

3.6 需要自己發明安全機制嗎 1. 安全機制的含義 首先解釋一下發明安全機制這句話的意思。安全機制包括&#xff1a;常見的對稱和非對稱加密算法&#xff0c;操作系統自帶的RBAC基于角色的訪問控制&#xff0c;自帶的防火墻Netfilter&#xff0c;Android的基于appid隔離的機制&…

鉤子方法

Class#inherited 類被繼承時調用 Module#included 模塊的生命周期中調用 Module#extend_object 模塊擴展類時調用 Module#method_added Module#method_removed Module#method_undefined轉載于:https://www.cnblogs.com/qinyan20/p/3656156.html

ember啟動報錯

ember[4858] (FSEvents.framework) FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() > (null) (-21) events.js:85 throw er; // Unhandled ‘error’ event ^ Error: watch EMFILE at exports._errnoException (util.js:746:11) at FSEvent.FS…

js日期比較大小_node.js 內存泄漏的秘密

每日前端夜話第276篇翻譯&#xff1a;瘋狂的技術宅作者&#xff1a;Giovanny Gongora來源&#xff1a;nodesource正文共&#xff1a;3955 字預計閱讀時間&#xff1a;10分鐘一直以來&#xff0c;跟蹤 Node.js 的內存泄漏是一個反復出現的話題&#xff0c;人們始終希望對其復雜性…

win7+vs2015/13+caffe+matlab+python(CPU only)配置

首先聲明本教程可以適用于vs2015 和vs2013 .以vs2015為例。 安裝必備軟件 vs 2015 /vs2013 matlab 2016a(64bit)推薦使用Anaconda 2.7 或者Miniconda 2.7這兩個Python發布版本cmake 3.8.0 以上caffe-window: https://github.com/BVLC/caffe/tree/windows 可選軟件&#xff1…

Performance Co-Pilot

Install Performance Co-Pilot 提前安裝依賴 [rootiZrj97j6t7ih9hgz1me35hZ ~]# cat install.sh yum install -y docker yum install -y git yum install -y yum-utils-1.1.31-40.el7.noarch yum install lex yum install flex yum install -y bison yum install -y perl-ExtUt…