<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .NET Conf 2020 - 基于ASP.NET Core構(gòu)建可熱插拔的插件化系統(tǒng)

          共 3304字,需瀏覽 7分鐘

           ·

          2020-12-23 22:31

          文章標(biāo)題:.NET Conf 2020 - 基于ASP.NET Core構(gòu)建可熱插拔的插件化系統(tǒng)

          作者:Lamond Lu

          項(xiàng)目地址:https://github.com/lamondlu/CoolCat

          博客:http://www.cnblogs.com/lwqlun

          以下是2020.12.19日的演講文稿和視頻:

          大家好,我是陸楠,我來(lái)自北京盛安德科技發(fā)展有限公司青島分公司,很高興能參加本次.NET開發(fā)者大會(huì),今天我分享的主題是《基于ASP.NET Core構(gòu)建可熱插拔的插件化系統(tǒng)》。

          插件化架構(gòu),又稱微核架構(gòu),指的是軟件的內(nèi)核相對(duì)較小,主要功能和業(yè)務(wù)邏輯都通過(guò)插件實(shí)現(xiàn)的架構(gòu)。

          插件化架構(gòu)一般有兩個(gè)核心概念:

          • 內(nèi)核
          • 插件

          內(nèi)核通常只包含系統(tǒng)運(yùn)行的最小功能,以及定義插件必須符合的接口;插件則是互相獨(dú)立的模塊,一般只包含單一的功能。

          插件化技術(shù)并不是一個(gè)新興的技術(shù),早期很多基于COM開發(fā)的WIN32程序其實(shí)都是插件化的系統(tǒng)。在.NET/.NET Core中,也有許多插件化的實(shí)現(xiàn)方案,例如,開源框架ABP, 開源的內(nèi)容管理系統(tǒng)DotNetNuke, 電子商務(wù)框架NopCommerce。

          在設(shè)計(jì)插件化方案的時(shí)候,我們需要考慮以下幾個(gè)問(wèn)題:

          • 如何隔離插件
          • 如何實(shí)現(xiàn)插件之間的通訊
          • 如何實(shí)現(xiàn)熱插拔

          在.NET Framework時(shí)代,我們最常用的方案是使用AppDomain應(yīng)用程序域來(lái)封裝插件。使用AppDomain, 我們可以將不同的插件隔離在不同的應(yīng)用程序域中。至于插件與插件之間的通訊,我們可以借助MarshalByRefObject類來(lái)實(shí)現(xiàn)。至于熱插拔,我們可以通過(guò)AppDomain自帶的Load/Unload方法來(lái)完成,非常的簡(jiǎn)單。

          但是到了.NET Core中,情況大不相同了。主要的原因是.NET Core中已經(jīng)將AppDomain的概念移除了,那么我們?cè)撊绾螌?shí)現(xiàn)插件化呢?

          這里我們首先要介紹的是ASP.NET Core中新引入的功能AssemblyLoadContext, 簡(jiǎn)稱ALC, ALC提供了一個(gè)類似AppDomain的隔離區(qū)域,你可以通過(guò)ALC來(lái)加載程序集,每個(gè)ALC加載的程序集之間互不干擾。

          這里請(qǐng)注意,正是由于這種設(shè)計(jì),如果將一個(gè)程序集引入到兩個(gè)不同ALC中,運(yùn)行時(shí)會(huì)認(rèn)為他們是不同的程序集。

          除了自定義的ALC, 在每個(gè)ASP.NET Core應(yīng)用啟動(dòng)的時(shí)候,運(yùn)行時(shí)都會(huì)創(chuàng)建一個(gè)默認(rèn)的ALC, 這里我們需要了解自定義ALC和默認(rèn)ALC的加載順序

          • 當(dāng)自定義ALC中的某個(gè)插件使用某個(gè)程序集的時(shí)候,會(huì)優(yōu)先查找當(dāng)前插件所在的自定義的ALC,如果找不到該程序集,則會(huì)進(jìn)一步查找默認(rèn)ALC, 所以ALC的程序集加載會(huì)優(yōu)先于默認(rèn)ALC

          我們前面說(shuō)過(guò),不同的ALC應(yīng)用相同的程序集,運(yùn)行時(shí)會(huì)認(rèn)為他們是不同的程序集,所以當(dāng)兩個(gè)插件使用相同程序集的,我們最好將這個(gè)程序集加載到默認(rèn)ALC中,否則在插件交互的時(shí)候可能會(huì)出現(xiàn)類型沖突。

          除了AssemblyLoadContext, 為了實(shí)現(xiàn)插件化,微軟在ASP.NET Core中還提供了另外一個(gè)高級(jí)特性Application Part - 應(yīng)用組件。

          Application Part并不算一個(gè)新特性,因?yàn)樵谒?NET Core 2.x版本中就已經(jīng)被引入了,但是可能部分開發(fā)人員沒(méi)有過(guò)或了解過(guò)它。Application Part為ASP.NET Core提供了強(qiáng)大的復(fù)用能力,使用Application Part, ASP.NET Core可以從程序集中發(fā)現(xiàn)控制器、視圖組件、Razor預(yù)編譯視圖、Tag Helper等功能,再借助Application Part Manager, 這些已經(jīng)編譯好的功能組件就可以在其它項(xiàng)目中直接復(fù)用了,這就極大提高了ASP.NET Core功能組件的可復(fù)用行。

          基于AssemblyLoadContextApplication Part, 你就可以輕松的實(shí)現(xiàn)ASP.NET Core的插件化了,但是如果想要在ASP.NET Core中實(shí)現(xiàn)一個(gè)可熱插拔的插件化組件系統(tǒng),我們還需要針對(duì)ASP.NET Core解決很多適配性問(wèn)題,例如:

          • 如果在運(yùn)行時(shí)加載預(yù)編譯視圖?
          • 如果在運(yùn)行時(shí)刷新路由和Controler/Action的映射關(guān)系?
          • 一個(gè)組件如何從另外一個(gè)組件拉取數(shù)據(jù)
          • 一個(gè)組件如何向另外一個(gè)組件發(fā)送消息通知,完成進(jìn)一步的業(yè)務(wù)操作

          為了簡(jiǎn)化這一部分的復(fù)雜度,我搭建了一個(gè)開源項(xiàng)目CoolCat, CoolCat默認(rèn)支持.NET Core 3.1和.NET 5。

          CoolCat已經(jīng)實(shí)現(xiàn)了以下的特性

          • 插件的安裝升級(jí)
          • 運(yùn)行時(shí)熱插拔插件
          • 插件間通訊
          • 類Swagger的插件文檔
          • 支持容器化

          以下是CoolCat的整體架構(gòu)圖:

          這里主程序?yàn)?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">CoolCat, 所有的插件都通過(guò)ALC加載到主程序中,主程序中定義了通知中心、文檔中心、查詢中心

          • 通知中心負(fù)責(zé)跨插件的消息通知
          • 文檔中心負(fù)責(zé)生成插件的文檔
          • 查詢中心負(fù)責(zé)跨插件的數(shù)據(jù)查詢

          并且為了簡(jiǎn)化創(chuàng)建插件項(xiàng)目,我創(chuàng)建了一個(gè)CoolCat插件模板,你可以通過(guò)dotnet new命令來(lái)安裝插件模板,并安裝模板項(xiàng)目。

          dotnet?new?–i?CoolCatModule
          dotnet?new?CoolCatModule?–n?{projectName}

          這里創(chuàng)建出的插件項(xiàng)目和一個(gè)普通MVC項(xiàng)目相差無(wú)幾,比較特殊的是項(xiàng)目會(huì)自動(dòng)生成一個(gè)plugin.json文件,里面包含了當(dāng)前插件的基本信息。

          如果這個(gè)項(xiàng)目的生成文件打包,那么它就是一個(gè)可移動(dòng)的插件安裝包了。

          下面呢,我們就通過(guò)一個(gè)簡(jiǎn)單的Demo, 給大家演示一下CoolCat項(xiàng)目的基本功能。

          這里我們首先使用dotnet run命令啟動(dòng)當(dāng)前CoolCat, 當(dāng)程序第一次啟動(dòng)的時(shí)候,會(huì)自動(dòng)建表。這里呢,我使用了FluentMigrator作為數(shù)據(jù)庫(kù)遷移工具,所以在項(xiàng)目啟動(dòng)時(shí),可以進(jìn)行自動(dòng)的腳本遷移。

          項(xiàng)目啟動(dòng)之后,我們就可以從瀏覽器打開這個(gè)項(xiàng)目了。項(xiàng)目的默認(rèn)界面是安裝界面,我們可以在這個(gè)界面上選擇一些預(yù)定義的插件,完成安裝

          當(dāng)然也不僅限于此,如果你想自定義一個(gè)其他的預(yù)安裝插件,你可以將這些插件放置在項(xiàng)目下的PresetModules目錄中。

          這里呢,我們就選擇默認(rèn)的2個(gè)插件,完成安裝。

          安裝完成之后,我們就會(huì)自動(dòng)進(jìn)入CoolCat的主界面。這里我們可以通過(guò)System菜單下的Plugins子菜單來(lái)管理插件。

          現(xiàn)在呢,我們來(lái)模擬一個(gè)場(chǎng)景,假設(shè)我們當(dāng)前開發(fā)了2個(gè)插件,一個(gè)是圖書庫(kù)存插件,一個(gè)是圖書租借插件。租借插件的數(shù)據(jù)來(lái)源是庫(kù)存插件。并且當(dāng)某本圖書從租借插件租出之后,庫(kù)存插件中的當(dāng)前圖書的狀態(tài)也應(yīng)該變?yōu)槌鰩?kù)狀態(tài)。

          這里我們首先通過(guò)CoolCat來(lái)安裝這2個(gè)插件。安裝完成之后,我們啟用插件,這里大家會(huì)發(fā)現(xiàn),當(dāng)我們啟動(dòng)插件之后,頂部導(dǎo)航欄中會(huì)自動(dòng)出現(xiàn)這個(gè)插件的菜單,這說(shuō)明我們的熱插拔功能正確的引導(dǎo)并加載的插件。

          下一步,我們進(jìn)入庫(kù)存插件,添加一本圖書C#, 添加完成之后,我們會(huì)發(fā)現(xiàn)這本書的默認(rèn)狀態(tài)是入庫(kù)狀態(tài)。

          現(xiàn)在我們打開圖書租借功能,我們會(huì)發(fā)現(xiàn)入庫(kù)狀態(tài)的圖書,正確的顯示在了可租借圖書列表界面,這說(shuō)明我們的跨插件拉取數(shù)據(jù)成功。

          這時(shí)候,我們選擇租出這本書,點(diǎn)擊Rent按鈕,操作完成之后,這本書就從可租借列表中消失了。

          下面我們回到圖書庫(kù)存插件,你會(huì)發(fā)現(xiàn)圖書庫(kù)存的狀態(tài)已經(jīng)變?yōu)槌鰩?kù),這是說(shuō)明我們的跨插件消息傳輸成功了,當(dāng)圖書租出之后,后續(xù)的出庫(kù)操作自動(dòng)完成。

          至此,我們就完成了這個(gè)簡(jiǎn)單的Demo

          如果大家感興趣的話,可以下載CoolCat項(xiàng)目自行體驗(yàn)一下,針對(duì)整個(gè)框架的研究過(guò)程和其中遇到的問(wèn)題,我都寫在了我的博客園站點(diǎn)中,大家可以自行查看。如果遇到問(wèn)題或者想?yún)⑴c到本項(xiàng)目中,可以給我發(fā)郵件,也可以在博客園給我留言。

          以上就是我今天分享的全部?jī)?nèi)容,謝謝大家。



          瀏覽 67
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  伊人综合成人网 | 国家一级黄色片 | 91你懂的 | av黄色电影一区天堂一区二区三区 | 国产 欧美 日韩 在线 |