999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于MEF技術(shù)的程序解耦探究

2015-05-30 10:48:04徐龍
科技尚品 2015年8期

徐龍

摘 要:利用插件技術(shù),人們可以隨時(shí)擴(kuò)展宿主程序的功能,這不僅提高了程序的擴(kuò)展性,也降低了宿主程序域各插件功能上的耦合,使程序變得更加容易維護(hù)。

關(guān)鍵詞:NET Framework;MEF;插件;解耦

1 MEF介紹

Managed Extensibility Framework(MEF)是.NET平臺(tái)下的一個(gè)擴(kuò)展性管理框架,它是一系列特性的集合,包括依賴注入等。MEF為開(kāi)發(fā)人員提供了一個(gè)工具,讓我們可以輕松地對(duì)應(yīng)用程序進(jìn)行擴(kuò)展并且對(duì)已有的代碼產(chǎn)生最小的影響。在開(kāi)發(fā)過(guò)程中,研發(fā)人員可以根據(jù)業(yè)務(wù)需求定義一些擴(kuò)展點(diǎn),在后期的維護(hù)中便可使用這些擴(kuò)展點(diǎn)與應(yīng)用程序交互;同時(shí)MEF使得宿主程序與擴(kuò)展程序之間不產(chǎn)生直接的依賴,這樣做的好處之一是多個(gè)具有同樣的擴(kuò)展需求之間可以很容易共享擴(kuò)展程序。

1.1 MEF體系結(jié)構(gòu)

MEF通過(guò)部件和容器來(lái)構(gòu)建。容器在類別中查找部件,類別在程序集或目錄中查找部件。容器把入口連接到出口上,部件因此可以用于宿主應(yīng)用程序。

MEF的核心技術(shù)是組合部件,它由一系列特性來(lái)描述和創(chuàng)建。每一個(gè)部件通過(guò)附加Export特性向其他部件提供功能,并通過(guò)附加Import特性來(lái)引用其他部件的功能。創(chuàng)建一個(gè)部件后,通過(guò)在定義好的部件目錄中查找需要的功能來(lái)實(shí)現(xiàn)部件的組裝。

MEF包括3大類別:用于宿主的類、基元類和基于特性機(jī)制的類。宿主類包含類別和容器。基元類可以用作基類,來(lái)擴(kuò)展MEF體系結(jié)構(gòu),以使用其他技術(shù)連接出口和入口。通過(guò)反射構(gòu)成基于特性機(jī)制的實(shí)現(xiàn)方式的類,如Export和Import特性等,提供擴(kuò)展方法,便于使用的基于特性的部件的類,這些也是MEF的一部分。

1.2 MEF部件的構(gòu)建過(guò)程

通過(guò)以下步驟便可輕松構(gòu)建MEF程序:

(1)定義部件目錄

(2)創(chuàng)建部件容器

(3)創(chuàng)建部件

(4)部件組裝與實(shí)例化

1.3 聲明一個(gè)部件

導(dǎo)出是部件向容器中的其他部件提供的一個(gè)值,而“導(dǎo)入”是部件向要通過(guò)可用導(dǎo)出滿足的容器提出的要求。在特性化編程模型中,導(dǎo)入和導(dǎo)出是由修飾類或成員使用Import和Export特性聲明的。Export特性可修飾類、字段、屬性或方法,而Import特性可修飾字段、屬性或構(gòu)造函數(shù)參數(shù)。為了使導(dǎo)入與導(dǎo)出匹配,導(dǎo)入和導(dǎo)出必須具有相同的協(xié)定。

1.4 部件的生命周期

由于部件承載于組合容器中,因此其生命周期可能比普通對(duì)象更復(fù)雜。需要在關(guān)閉時(shí)執(zhí)行工作的部件和需要釋放資源的部件應(yīng)照常為NET Framework對(duì)象實(shí)現(xiàn)IDisposable。但是,由于容器創(chuàng)建并維護(hù)對(duì)部件的引用,因此只有擁有部件的容器才應(yīng)對(duì)其調(diào)用Dispose方法。容器本身實(shí)現(xiàn)IDisposable,并且作為Dispose中其清理的一部分,它將對(duì)擁有的所有部件調(diào)用Dispose。因此,當(dāng)不再需要組合容器及其擁有的任何部件時(shí),您應(yīng)始終釋放該組合容器。

2 利用MEF技術(shù)解耦程序

下文通過(guò)開(kāi)發(fā)簡(jiǎn)單的數(shù)據(jù)庫(kù)入庫(kù)工具來(lái)逐步說(shuō)明。

2.1 簡(jiǎn)單的入庫(kù)工具

假設(shè)需要開(kāi)發(fā)一款數(shù)據(jù)庫(kù)入庫(kù)工具,并且準(zhǔn)備采用SQL Server作為數(shù)據(jù)庫(kù)管理系統(tǒng),可以使用在.NET下ADO.NET 進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)。

如果使用一段時(shí)間后,需要兼容其他的數(shù)據(jù)庫(kù),如Oracle、MySql等,這就可能需要修改代碼,以適應(yīng)新的需求。

很顯然,訪問(wèn)數(shù)據(jù)庫(kù)的業(yè)務(wù)邏輯與主程序產(chǎn)生了緊耦合,使得程序在需求改變后很難擴(kuò)展,這不符合OCP(Open-Closed Principle)原則。

2.2 利用MEF技術(shù)實(shí)現(xiàn)解耦

上述問(wèn)題如果使用MEF技術(shù)則很容易解決。將入庫(kù)工具看作宿主程序,將入庫(kù)的具體業(yè)務(wù)放入插件中執(zhí)行。通過(guò)添加插件來(lái)實(shí)現(xiàn)兼容不同的數(shù)據(jù)庫(kù)。

2.2.1 定義Import類型

在宿主程序中添加類型為IDataAccess的屬性,并將Import特性附加其上。這樣在程序運(yùn)行中,部件在目錄中查找接口協(xié)定,并實(shí)例化。而部件的組裝是通過(guò)反射技術(shù)動(dòng)態(tài)進(jìn)行的,這樣便可在任何時(shí)候在滿足接口協(xié)定的情況下根據(jù)需要來(lái)實(shí)現(xiàn)IDataAccess。

應(yīng)當(dāng)將IDataAccess放在獨(dú)立的程序集中,這樣宿主程序集和插件程序集可以分別引用IDataAccess所在的程序集,從而避免了宿主程序集直接應(yīng)用插件程序集而產(chǎn)生不必要的耦合。

2.2.2 定義Ecport

在實(shí)現(xiàn)IDataAccess的類中,需要加入Export特性,這是插件實(shí)現(xiàn)個(gè)關(guān)鍵步驟。因?yàn)椴考诮M裝過(guò)程中根據(jù)Export特性來(lái)匹配和實(shí)例化。

MEF時(shí)基于反射來(lái)實(shí)現(xiàn)的。這樣在后期需要兼容其他數(shù)據(jù)庫(kù)時(shí),只要新建獨(dú)立的程序集并使用需要的數(shù)據(jù)庫(kù)訪問(wèn)類實(shí)現(xiàn)IDataAccess接口,將上述程序集拷貝到宿主程序的運(yùn)行目錄中即可。

2.2.3 部件組裝

部件組裝很容易實(shí)現(xiàn),只需定義部件目錄DirectoryCatalog,并使用上述對(duì)象實(shí)例化部件容器CompositionContainer,同時(shí)使用部件容器的ComposeParts()方法,從特性化對(duì)象中創(chuàng)建可組合部件,并在當(dāng)前容器中組合這些部件。只需3行代碼便可完成部件的組裝,具體如下:

var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory);

var container = new CompositionContainer(catalog);

container.ComposeParts(this);

3 總結(jié)

MEF的組合基元是可擴(kuò)展支持的本質(zhì),它看起來(lái)顯得非常的簡(jiǎn)單,但卻有能夠支持強(qiáng)大的功能并且不失靈活性。上例中正是利用這種原理輕松的實(shí)現(xiàn)了主程序與具體的業(yè)務(wù)之間的解耦。

參考文獻(xiàn)

[1]ChristianNagel ProfessionalC#4and. NET4[M].清華大學(xué)出版社,2010.

(作者單位:安徽四創(chuàng)電子股份有限公司)

主站蜘蛛池模板: 手机在线免费毛片| 欧美一道本| 久久国产精品麻豆系列| 999精品在线视频| 国产无码在线调教| 久久国产黑丝袜视频| 日韩无码黄色| 国产综合网站| 国产精品亚洲精品爽爽| 一级高清毛片免费a级高清毛片| 国产精品第三页在线看| 波多野结衣视频一区二区| 国产精品微拍| 国产一级毛片高清完整视频版| 亚洲综合色在线| 免费一看一级毛片| 在线观看亚洲人成网站| 在线国产毛片| 国产一区二区三区免费| 亚洲欧美另类中文字幕| 小蝌蚪亚洲精品国产| AV在线天堂进入| 激情爆乳一区二区| 91久久天天躁狠狠躁夜夜| 四虎永久免费在线| 毛片大全免费观看| 97影院午夜在线观看视频| 国产视频只有无码精品| 日韩精品一区二区三区中文无码| 亚洲男女天堂| 中文字幕亚洲专区第19页| …亚洲 欧洲 另类 春色| 真人高潮娇喘嗯啊在线观看| 欧美黄网在线| 日本黄色不卡视频| 国产成人综合网| 996免费视频国产在线播放| 国产精品99r8在线观看| 国产乱子伦无码精品小说| 日韩av在线直播| 亚洲爱婷婷色69堂| 国模私拍一区二区| 亚洲色欲色欲www网| av一区二区三区高清久久| 91在线精品免费免费播放| 国产精品观看视频免费完整版| 少妇极品熟妇人妻专区视频| 亚洲AV无码不卡无码| 91青青草视频在线观看的| 国产1区2区在线观看| 午夜a级毛片| 毛片久久网站小视频| 人人爱天天做夜夜爽| 亚洲中久无码永久在线观看软件 | 精品一区二区三区无码视频无码| 欧洲免费精品视频在线| 久久精品国产精品青草app| 日韩无码视频网站| 日韩A∨精品日韩精品无码| 欧美亚洲欧美区| 自拍中文字幕| 亚洲国产无码有码| 午夜在线不卡| 国产在线视频导航| 国产精品伦视频观看免费| 26uuu国产精品视频| 欧美视频在线播放观看免费福利资源| 国产成人亚洲毛片| 草草影院国产第一页| 国产精品白浆在线播放| 无码AV动漫| 永久成人无码激情视频免费| 亚洲精品天堂自在久久77| 中文无码精品A∨在线观看不卡| 精品无码视频在线观看| 亚洲美女久久| 国产地址二永久伊甸园| 99久久免费精品特色大片| 国产高清毛片| 91免费精品国偷自产在线在线| 国产成人精品2021欧美日韩| 奇米影视狠狠精品7777|