MEF學習筆記(2) 定義組成部件和契約

2022-03-07 06:09:33 字數 1823 閱讀 3971

組成部件

乙個組成部件是mef裡的乙個組成單位。組成部件給其它需要的組成部件匯出服務,和從其它組成部件匯入服務。在mef的設計模型裡,組成部件屬於用system.componentmodel.composition.import[system.componentmodel.composition.export]特性來修飾它們的匯入和匯出。乙個組成部件應該至少包括乙個匯出。組成部件不是直接新增到容器就是通過使用的目錄建立。mef預設掃瞄的目錄通過匯出特性來識別。

契約

組成部件不能直依懶於另乙個組成部件,而是通過依懶於字串識別的契約。每個匯出有乙個契約,並且每個匯入修飾它需要的契約。容器使用契約的資訊去進行匯入與匯出間的匹配。如果沒有指定契約,mef會暗自使用該類完全規範的類名作為契約。如果乙個型別被傳進來,它也會使用全規範名稱。

注意:預設乙個型別會被傳給契約,而不是乙個字串。雖然契約可以作為乙個任意的字串,但這會導致多義性。例如:「sender"可能會被另乙個專案不同類庫裡面的"sender"所覆蓋。所以如果你需要指定乙個字串契約,建議你契約的命名應該用命名空間來規範,包括公司名稱,例如:"contoso.exports.sender".

按照上面的**說明,所有的匯出應該是這樣的:

namespace

mefsample

[export(

typeof

(exporter))]

public

class

exporter1

[export(

"mefsample.exporter")]

public

class

exporter2

}

介面/抽象 契約

乙個普通的模式是讓組成部件去匯出乙個介面或乙個抽象型別契約而不是乙個具體的型別。這就可以讓匯入者完全從匯出的特定的實現中解耦,這種匯入產生於關注點的分離。例如下面你會看到有兩個都匯出imessagesender的sender實現。notifier類匯入乙個imessagesender集合,它用來呼叫它的send()方法。新資訊sender現在可以很輕易的新增到系統裡。

[export(typeof

(imessagesender))]

public

class

emailsender : imessagesender

[export(

typeof

(imessagesender))]

public

class

tcpsender : imessagesender

public

class

notifier

public

void notify(string

message)

}

契約程式集

當用mef開發乙個可擴充套件的應用程式的乙個普通的模式是去部署乙個契約程式集。乙個契約程式集是乙個簡單的**集,它包括了契約型別,擴充套件部分可以使用它來擴充套件你的應用。一般的這些會作為介面,但他們也可以是抽象類。另外契約程式集很可能會包括元資料檢視介面,它像任何自定義mef匯出特性一樣有用。

注意:你必須指定具體的介面型別(imessagesender)作為匯出,另外這個型別(emailsender)自身也會被匯出。

Qt筆記 自定義部件和窗體

每個部件都可以看成是4個矩形,從內至外 內容 填襯 邊框 邊距。各個部分屬性為0時,4個矩形重合。樣式表可以存在.qss檔案中,可以使用以下方式實現變換式樣。if qssfile filename qss my.qss qssfile setfilename qss my1.qss else qss...

C Primer學習筆記 變數宣告和定義

int a 0 int a 列表初始化,不能強制型別轉化 但是我試的是可以的 int a 0 int a 列表初始化,不能強制型別轉化宣告和定義的關係 c 語言支援 分離式編譯 可以將程式分割為若干個檔案,單獨編譯。當檔案 間變數共享時,會使用ectern將變數的宣告和使用分離開來。宣告 規定了變數...

學習筆記 樹的定義和性質

記 今天做到pat1004題,讀完題發現是個關於樹的題目,而我之前對樹沒有了解,但是內心又比較害怕就對樹產生了排斥的心理,從今天開始學習樹,攻克弱點。1 樹可以無結點,為空樹 2 樹的層次從根結點開始,根結點為第一層,以此類推 3 結點的度 該結點的子樹的個數 樹的度 樹的所有結點中最大的度 4 因...