NopCommerc MVC 外掛程式機制分析

來源:互聯網
上載者:User

基本原理

外掛程式話的應用程式一般都是先定義外掛程式介面,然後把外掛程式編譯的dll放到固定的目錄中,應用程式主程式通過載入那些實現了外掛程式介面的dll來實現外掛程式的使用。NopCommerce也是這樣,但作為MVC Web應用程式會有一些不一樣,首先是不同信任層級(Full Trust,Medium Trust)的時候載入dll的策略會有不一樣,另外就是怎樣顯示外掛程式中的View的問題。

 

放外掛程式的檔案夾

NopCommerce的外掛程式放在網站主目錄的Plugins目錄下,Plugins下面有很多檔案夾,一個外掛程式類庫就是一個檔案夾。在外掛程式類庫中修改編譯輸出的地址為網站主目錄的Plugins檔案夾,這樣外掛程式產生的dll就能自動在目標檔案夾下面。如:

另一個檔案夾是ShadowCopy檔案夾,就在Plugins/bin檔案夾下。關於為什麼要用ShadowCopy,住這篇文章中有所敘述,NopCommerce就是參考它的實現。裡面也詳細敘述了信任層級的問題。

 

網站啟動

我們先來看PluginManager.Initialize方法。通過在PluginManager類上定義如下屬性保證PluginManager的Initialize方法在網站開始的時候運行,早於Application_Start運行。

[assembly: PreApplicationStartMethod(typeof(PluginManager), "Initialize")]

在Application_Start之前運行初始化代碼主要是為了讓網站應用程式程式可以引用到載入的dll。

 

核心類

IPluginFinder.cs介面:擷取外掛程式的資訊介面,在ioc裡的Nop.Web.Framework.DependencyRegistrar註冊此介面。系統啟動的時候會載入到記憶體裡。

IPlugin.cs:外掛程式的操作介面,主要有設定外掛程式的屬性資訊,安裝外掛程式介面,卸載外掛程式介面。

BasePlugins.cs 實現IPlugin.cs的方法。

PluginDescriptor.cs  外掛程式的實體類,包含了外掛程式的版本、描述,類型,檔案名稱,作者,等等一系列狀態。

PluginFileParser.cs 包含對外掛程式的實體操作方法,主要是寫入外掛程式的描述資訊。

PluginFinder.cs 載入所有的外掛程式,並擷取它們的資訊.

PluginManager.cs 外掛程式管理的主類,看裡面的注釋,它的外掛程式機制應該是參考的Umbraco這個cms的。

 

載入外掛程式

首先載入外掛程式的描述。每一個外掛程式都必須定義一個外掛程式描述檔案,用文字檔Description.txt來定義,名字也是約定的,不能是其他名字。在外掛程式的類庫中添加Description.txt,對外掛程式進行描述。Description中的文字欄位的格式是固定的,PluginManager會把Description.txt檔案轉化成PluginDescriptor類,然後儲存在記憶體中。Description中的DisplayOrder欄位表示了這個外掛程式的順序,以便在介面上顯示。擷取所有的外掛程式描述檔案後,它就會去InstalledPlugins.txt裡面看,在InstalledPlugins.txt裡面有的就是已經安裝的查件,沒有的話就是沒有安裝的。PluginDescriptor.Installed屬性描述了這個資訊。

把需要載入的dll複製到Plugins/bin檔案夾下,當然都是要繼承自IPlugIn介面的,通過Assembly.Load在家這個dll,再用BuildManager.AddReferencedAssembly把這個dll載入到網站這個應用程式中。要注意的是BuildManager.AddReferencedAssembly必須早網站程式的Application_PreStartInit過程中加入,也就是在Application_Start前。這是要引用的外掛程式都被放在了Plugins/bin下,並被CLR引用了。被引用的外掛程式的Assembly引用將被儲存在PluginManager的靜態列表中ReferencedPlugins。PluginManager的Initialize方法到此結束。

 

在介面上顯示外掛程式

舉例來說,我們在定義外掛程式的時候會定義一種類型的外掛程式,比如發貨方式。那麼我們在定義外掛程式的時候會繼承2個介面,一個是IPlugin介面,一個是IShippingMethod介面。在需要顯示發貨方式外掛程式的時候通過PluginFinder.GetPlugins<T>().ToList() 方法去擷取。PluginFinder會去上一步的PluginManager.ReferencedPlugins列表裡面去尋找。返回的是IShippingMethod的執行個體。NopCommerce有個txt檔案:InstalledPlugs.txt。只有在這個裡面的外掛程式最終會載入到介面上去。可以通過NopCommerce的查件管理頁面把最終需要作用於網站的外掛程式加入到這個檔案中。

 

 

 

配置外掛程式

NopCommerce的admin網站可以對外掛程式進行配置。如:可以配置Display Order 和 IsActive等。主要的邏輯是更新該外掛程式的Description.txt檔案和記憶體中的IPlugin.Descriptor裡面的屬性。

 

定義外掛程式中的Controller,Action和View

稍微複雜的外掛程式基本都包含自己要處理的介面和邏輯。所以在外掛程式的類庫中可以定義外掛程式的介面View和相關Controller和Action。在建立Controller和View的時候,不一定要按照規範的Controllers檔案夾和Views檔案夾來定義,可以定義自己的風格。

在Action中返回View的時候,要輸入View的名稱,這個名稱要包含名稱空間,例如:

return View("Nop.Plugin.Payments.CashOnDelivery.Views.PaymentCashOnDelivery.Configure", model);

因為,在編譯過後的外掛程式dll中,作為嵌入資源的View會被編譯成名叫Nop.Plugin.Payments.CashOnDelivery.Views.PaymentCashOnDelivery.Configure.cshtml的資源檔。

NopCommerce通過一些外掛程式的Configure介面,把一些外掛程式的配置資訊儲存到資料庫中。然後在前台頁面顯示的時候再從資料庫擷取。

 

讀取內嵌資源View

外掛程式作為一個類庫被載入到應用程式定義域中。而在定義外掛程式的View的時候,需要把cshtml檔案的屬性修改成Embedded Resource。它是作為嵌入式資源放到AppDomain中去的。我們可以通過VirtualPathProvider,使 Web 應用程式可以從虛擬檔案系統中檢索資源,您可以在這篇文章中找到相關知識,NopCommerce的實現和這篇文章是一樣的。在NopCommerce中的Nop.Web.Framework類庫中有個EmbeddedViews檔案夾,裡麵包含了如果處理嵌入的View的一些類。最後需要在Global.asax進行註冊。NopCommerce的代碼如下:

//register virtual path provider for embedded viewsvar embeddedViewResolver = EngineContext.Current.Resolve<IEmbeddedViewResolver>();var embeddedProvider = new EmbeddedViewVirtualPathProvider(embeddedViewResolver.GetEmbeddedViews());HostingEnvironment.RegisterVirtualPathProvider(embeddedProvider);

 

 

 

編寫NopCommerce外掛程式

可以參考官方文檔。其中有一條建議非常好,就是Copy原來的外掛程式,在上面修改。

 

 

把NopCommerce相關外掛程式的部分代碼摘取了出來,可以從這裡下載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.